#==================================================================
# display the bytes in an integer as bits
#
# FYI: www.geeksforgeeks.org/how-to-convert-int-to-bytes-in-python/
# =================================================================
# ----
# ---- create a string of bits from a list of bytes
# ----
def bits_from_bytes(byt_list: list[bytes]) -> str:
bit_strs = []
for byt in byt_list:
bit_strs.append(f'{byt:<08b}')
return ' '.join(bit_strs)
# ----
# ---- bits in a byte
# ----
print()
for i in range(5):
print(f'integer {i} = {i:08b}')
# ----
# ---- bits in an ASCII character (byte)
# ----
print()
chars = ['a','b','c','d']
for c in chars:
print(f'char = {c} integer {ord(c):<3} = {ord(c):08b}')
# ----
# ---- bits in a large integer
# ----
ints = [ 257, 32768, -127 ]
for i in ints:
if i < 0:
bytes = i.to_bytes(4,signed=True)
else:
bytes = i.to_bytes(4)
print()
print(f'integer = {i:<5} bytes = {bytes}')
print(bits_from_bytes(bytes))
#=================================================================
# display the byte order of your system
# display the number of bytes in an integer
# =================================================================
import sys
byte_order = sys.byteorder
print()
print(f'system is "{byte_order}" endian')
# -----------------------------------------------------------------
def integer_bytes(integer:int, order:str='big') -> None:
# ---- number of bytes in an integer
def byte_length(integer):
return (integer.bit_length() + 7) // 8
print()
print(f'integer {integer}')
numbyt = byte_length(integer)
print()
print(f'{numbyt} bytes in integer {integer}')
bytes = integer.to_bytes(numbyt,order,signed=True)
print()
print(f'bytes: {bytes}')
bits = ' '.join([f'{x:08b}' for x in bytes])
print (f'bits : {bits}')
# -------------------------------------------------------
print()
print('---- BIG endian ---------------------')
integer_bytes(258)
integer_bytes(-258)
print()
print('---- LITTLE endian ------------------')
integer_bytes(258,'little')
integer_bytes(-258,'little')