cookbook3.5 从字节串中打包和解包大整数

打包

x = 17777777777777777
a = x.to_bytes(16, "big", signed = False)
b = x.to_bytes(16, "little", signed = False)
print(a)
print(b)

b'x00x00x00x00x00x00x00x00x00?(xcbqWx1cq'
b'qx1cWqxcb(?x00x00x00x00x00x00x00x00x00'
[Finished in 0.1s]

    打包中,16代表的是字节串中元素的数量,一个元素指的是x12这样的单元,"big"表示大头在前也就是正常顺序,“litte”表示小头在前也就是逆序,大头的x12x34写成小头就是x34x12,signed 表示的是是否有符号位,默认为False,如果为True,那么默认按照补码进行编程;

    数字的字节带下可以通过int.bit_length()来确定,得到的是数字转成二进制之后的数字

In [3]: 1.bit_length()
  File "<ipython-input-3-280223f53fbc>", line 1
    1.bit_length()
               ^
SyntaxError: invalid syntax


In [4]: a = 1

In [5]: a.bit_length()
Out[5]: 1

In [6]: int.bit_length(1)
Out[6]: 1

In [7]: int.bit_length(-1)
Out[7]: 1

In [8]: int.bit_length(-2)
Out[8]: 2

    值得注意的地方:1,不能直接使用3.bit_length()这样,要么改成int.bit_length(3),要么先存到变量中a.bit_length()  2,得到的结果是绝对值二进制后的位数,和正负无关

    实际编码要对上面的数字进行divmod(a, 8)这样的取余操作,因为是8个二进制一节的

  

    解码int.from_bytes()同样是三个参数,第一个是字符串,第二个是"big"还是"little",第三个是signed 表示的是是否有符号位,默认为False,完全是逆运算,

a2 = b'x85xbexc1+Kx9a@xd8xf4x83xcbx1cqxc7x1cx71'
x2 = int.from_bytes(a2, "big")
print(x2)

177777777777777777777777777777777777777
[Finished in 0.3s]

    最后小伙伴们可能发现了,压缩的字符串有着一些奇怪的符号,经过我的实验那些应该一些字节段的缩写有一些很奇怪的字母,应该是一些字节段的缩写,我写了如下的代码来验证

for i in range(16,16*16):
    a = i.to_bytes(1, "big")
    print("{:#x}: {}".format(i, a))

    输出的话我只截取了不正常的部分

0x20: b' '
0x21: b'!'
0x22: b'"'
0x23: b'#'
0x24: b'$'
0x25: b'%'
0x26: b'&'
0x27: b"'"
0x28: b'('
0x29: b')'
0x2a: b'*'
0x2b: b'+'
0x2c: b','
0x2d: b'-'
0x2e: b'.'
0x2f: b'/'
0x30: b'0'
0x31: b'1'
0x32: b'2'
0x33: b'3'
0x34: b'4'
0x35: b'5'
0x36: b'6'
0x37: b'7'
0x38: b'8'
0x39: b'9'
0x3a: b':'
0x3b: b';'
0x3c: b'<'
0x3d: b'='
0x3e: b'>'
0x3f: b'?'
0x40: b'@'
0x41: b'A'
0x42: b'B'
0x43: b'C'
0x44: b'D'
0x45: b'E'
0x46: b'F'
0x47: b'G'
0x48: b'H'
0x49: b'I'
0x4a: b'J'
0x4b: b'K'
0x4c: b'L'
0x4d: b'M'
0x4e: b'N'
0x4f: b'O'
0x50: b'P'
0x51: b'Q'
0x52: b'R'
0x53: b'S'
0x54: b'T'
0x55: b'U'
0x56: b'V'
0x57: b'W'
0x58: b'X'
0x59: b'Y'
0x5a: b'Z'
0x5b: b'['
0x5c: b'\'
0x5d: b']'
0x5e: b'^'
0x5f: b'_'
0x60: b'`'
0x61: b'a'
0x62: b'b'
0x63: b'c'
0x64: b'd'
0x65: b'e'
0x66: b'f'
0x67: b'g'
0x68: b'h'
0x69: b'i'
0x6a: b'j'
0x6b: b'k'
0x6c: b'l'
0x6d: b'm'
0x6e: b'n'
0x6f: b'o'
0x70: b'p'
0x71: b'q'
0x72: b'r'
0x73: b's'
0x74: b't'
0x75: b'u'
0x76: b'v'
0x77: b'w'
0x78: b'x'
0x79: b'y'
0x7a: b'z'
0x7b: b'{'
0x7c: b'|'
0x7d: b'}'
0x7e: b'~'

   解包时候带这些字符或者是这些字符的相对应的16进制数都可以正常转化为数字

    如上就是大整数和字节串的转化,参考python cookbook

    后续的struct模块解包我会有空补上

原文地址:https://www.cnblogs.com/mangmangbiluo/p/9888830.html