zoukankan      html  css  js  c++  java
  • 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模块解包我会有空补上

  • 相关阅读:
    C++ XML文件解析
    coco2d-x create tableView
    cocos2d-x button setTitleLabel
    cocos2d-X create std colorlayer
    Windows cmd "tree"
    C/C++ std::function && std::bind
    C/C++ “std::invoke”: 未找到匹配的重载函数
    31 迭代器 Iterator 是什么?
    30 哪些集合类是线程安全的?
    02 rpx 与 px
  • 原文地址:https://www.cnblogs.com/mangmangbiluo/p/9888830.html
Copyright © 2011-2022 走看看