在Python中打包整数到3个字节

时间:2016-08-03 05:52:32

标签: python

具有C的背景知识我想将整数序列化为3个字节。我搜索了很多,发现我应该使用struct packing。我想要这样的东西:

number = 1195855
buffer = struct.pack("format_string", number)

现在我希望缓冲区类似于['\x12' '\x3F' '\x4F']。是否也可以设置字节顺序?

2 个答案:

答案 0 :(得分:3)

可以在格式字符串中使用><

import struct

number = 1195855

def print_buffer(buffer):
    print(''.join(["%02x" % ord(b) for b in buffer]))   # Python 2
    #print(buffer.hex())                                # Python 3


# Little Endian
buffer = struct.pack("<L", number)
print_buffer(buffer)                # 4f3f1200

# Big Endian
buffer = struct.pack(">L", number)
print_buffer(buffer)                # 00123f4f

但是,请注意,您将不得不弄清楚如何摆脱缓冲区中的空字节,因为L将为您提供4个字节,而您只需要3个字节。

类似的东西:

buffer = struct.pack("<L", number)
print_buffer(buffer[:3])            # 4f3f12

# Big Endian
buffer = struct.pack(">L", number)
print_buffer(buffer[-3:])           # 123f4f

将是一种方式。

答案 1 :(得分:0)

另一种方法是手动打包字节:

>>> import struct
>>> number = 1195855
>>> data = struct.pack('BBB',
...     (number >> 16) & 0xff,
...     (number >> 8) & 0xff,
...     number & 0xff,
... )
>>> data
b'\xa5Z'
>>> list(data)
[18, 63, 79]

由于只有3个字节,所以有点多余,因为struct.pack的最后3个参数等于data。但这在我的情况下效果很好,因为我在无符号的24位整数周围有页眉和页脚字节。

此方法或切片是否更优雅取决于您的应用程序。我发现这对我的项目来说更干净。