1. 程式人生 > >python之from_bytes、to_bytes

python之from_bytes、to_bytes

首先我們來看兩個__builtin__函式

num1 = int.from_bytes(b'12', byteorder = 'big')
num2 = int.from_bytes(b'12', byteorder = 'little')
print('(%s,'%'num1', num1, '),', '(%s,'%'num2', num2, ')')
result:(num1, 12594 ), (num2, 12849 )
byt1 = (1024).to_bytes(2, byteorder = 'big')
byt2 = (1024).to_bytes(10, byteorder = 'big'
) byt3 = (-1024).to_bytes(10, byteorder= 'big') lis1 = ['byt1', 'byt2', 'byt3', 'byt4'] lis2 = [byt1, byt2, byt3, byt4] lis3 = zip(lis1, lis2) dic = dict(lis3) print(dic)
result:
byt1': b'\x04\x00'
byt2': b'\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00'
byt3': b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
byt4': b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'int.from_bytes()功能是將位元組轉化成int型數字'12'如果沒有標明進位制,看做ascii碼值,'1' = 49 = 0011 0001, '2' = 50 = 0011 0010,如果byteorder = 'big', b'12' = 0010 0001 0010 0010 = 12594;如果byteorder = 'littlele', b'12' = 0011 0010 0011 0001 = 12849。第三個引數為signed表示有符號和無符號;(number).to_bytes()功能將整數轉化成byte
(1024
).to_bytes(10, byteorder = 'big'),一個int型,4位元組。1024 = 0000 0000 0000 0000 0000 0100 0000 0000,由於給定的是10,所以湊齊10個位元組,高位用6個 0000 0000佔位,如果最後用16進製表示,1024 = b'\x00\x00\x00\x00\x00\x00\x00\x00x04\x00
在看一個例子:
byt3 = (-1024).to_bytes(10, byteorder= 'big', signed = 'true'),由於signed = 'true', -1024 = 1000 ...(11) 0000 0000 0000  0000 0000 0100 0000 0000,符號位為1,...省略了
11個0000,由於負數由補碼錶示,所以先求-1024的反碼,即符號位不變,其他位0變1,1變0,得:1111 ...(11) 1111 1111 1111 1111 1111 1011 1111 1111,對反碼 + 1,得到補碼:
1111 ...(11) 1111 1111 1111 1111 1111 1100 0000 0000,用16進製表示:\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00
再舉個例子:
num3 = int.from_bytes(b'\xf3\x25', byteorder = 'little')
f3 = 243(10進位制)= 1111 0011,25 = 37(10進位制)= 0010 0101,byteorder = 'little',位元組的低位佔主要作用, 得到:0010 0101 1111 0011,得到十進位制:9715
num3 = int.from_bytes(b'\xf3\x25', byteorder = 'big', signed = 'true')
f3 = 243(10進位制)= 1111 0011,25 = 37(10進位制)= 0010 0101,byteorder = 'big',位元組的高位佔主要作用, 得到:1111 0011 0010 0101,signed = 'true',說明有符
號,而且高位為1,所以用補碼:1000 1100 1101 1011 即:-3291