具有C的背景知识我想将整数序列化为3个字节。我搜索了很多,发现我应该使用struct packing。我想要这样的东西:
number = 1195855
buffer = struct.pack("format_string", number)
现在我希望缓冲区类似于['\x12' '\x3F' '\x4F']
。是否也可以设置字节顺序?
答案 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位整数周围有页眉和页脚字节。
此方法或切片是否更优雅取决于您的应用程序。我发现这对我的项目来说更干净。