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'\x00\x00\x00\x00\x00\x00\x00\x00\x00?(\xcbqW\x1cq' b'q\x1cWq\xcb(?\x00\x00\x00\x00\x00\x00\x00\x00\x00' [Finished in 0.1s]
打包中,16代表的是字节串中元素的数量,一个元素指的是\x12这样的单元,"big"表示大头在前也就是正常顺序,“litte”表示小头在前也就是逆序,大头的\x12\x34写成小头就是\x34\x12,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'\x85\xbe\xc1+K\x9a@\xd8\xf4\x83\xcb\x1cq\xc7\x1c\x71' 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模块解包我会有空补上