【问题标题】:How to convert integer value to array of four bytes in python如何在python中将整数值转换为四字节数组
【发布时间】:2017-11-27 05:04:51
【问题描述】:

我需要在 Python 中发送字节消息,并且需要将无符号整数转换为字节数组。如何在 Python 中将整数值转换为四字节数组?就像在 C 中一样:

uint32_t number=100;
array[0]=(number >>24) & 0xff;
array[1]=(number >>16) & 0xff;
array[2]=(number >>8) & 0xff;
array[3]=number & 0xff;

谁能告诉我怎么做?一开始我对没有类型的编程很奇怪。

【问题讨论】:

    标签: python


    【解决方案1】:

    看看struct 模块。可能您只需要struct.pack("I", your_int) 将整数打包成一个字符串,然后将该字符串放入消息中。格式字符串"I" 表示一个无符号的 32 位整数。

    如果你想将这样的字符串解包为整数的元组,你可以使用struct.unpack("4b", s):

    >>> struct.unpack("4b", struct.pack("I", 100))
    (100, 0, 0, 0)
    

    (这个例子显然是在一个 little-endian 机器上。)

    【讨论】:

    • 根据运行此代码的机器,主机字节顺序可能不是您想要的。使用“!I”将无符号整数序列化为网络字节序。
    【解决方案2】:

    这是一个旧线程,但在 Python 3.2+ 中,现在您可以简单地说:

    number = 100
    number.to_bytes(4, byteorder = 'big')
    

    byteorder = 'little' 根据您的需要。文档here

    【讨论】:

    • 并且没有变量:(100).to_bytes(4, byteorder = 'big')
    • .to_bytes(4, byteorder = 'big', signed=True) 表示负整数
    【解决方案3】:

    Sven有你回答。但是,在 Python 中也可以使用字节移位数字(如您的问题):

    >>> [hex(0x12345678 >> i & 0xff) for i in (24,16,8,0)]
    ['0x12', '0x34', '0x56', '0x78']
    

    【讨论】:

      【解决方案4】:

      你几乎可以做同样的事情:

      >>> number = 100
      >>> array[0] = (number>>24) & 0xff
      >>> array[1] = (number>>16) & 0xff
      >>> array[2] = (number>>8) & 0xff
      >>> array[3] = number & 0xff
      

      或者你可以做一些更短的事情:

      >>> array = [(number>>(8*i))&0xff for i in range(3,-1,-1)]
      

      【讨论】:

        【解决方案5】:

        如果有人稍后再看这个问题...
        这句话应该和原题中的代码是等价的:

        >>> tuple( struct.pack("!I", number) )
        ('\x00', '\x00', '\x00', 'd')
        

        而且我认为主机字节顺序是什么并不重要。
        如果您的整数大于 int32,您可以在调用 pack() 时使用 "!Q" 获取 int64(如果您的系统支持 Q)。
        list() 甚至bytearray() 将代替tuple()

        注意,结果是str 对象的序列(每个对象包含一个字节),而不是整数。如果你必须有一个整数列表,你可以这样做:

        [ ord(c) for c in struct.pack("!I", number) ]
        [0, 0, 0, 100]
        

        ...或者这个:

        >>> map( ord, tuple( struct.pack("!I", number) ) )
        [0, 0, 0, 100]
        

        但是使用map() 开始让事情变得有点混乱。

        【讨论】:

          【解决方案6】:

          也可以使用ctypes 完成。它对于将浮点数转换为字节特别有用。示例:

          >>> bytes(ctypes.c_uint32(0x20))
          b' \x00\x00\x00'
          >>> bytes(ctypes.c_double(1))
          b'\x00\x00\x00\x00\x00\x00\xf0?'
          

          【讨论】:

            【解决方案7】:

            为了完整起见:您还可以使用array 模块:

            >>> from array import array
            >>> a = array('I', [100]) # note that 'I' and such are machine-dependent.
            >>> a.tostring()
            '\d\x00\x00\x00'
            >>> a.byteswap()
            >>> a.tostring()
            '\x00\x00\x00\d'
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-11-14
              • 1970-01-01
              • 1970-01-01
              • 2012-07-11
              • 2015-12-06
              • 1970-01-01
              • 2020-03-19
              相关资源
              最近更新 更多