我有一个包含3个字节的字节流,我必须将其转换为unsigned int 32.在CI中,只使用bzero将整数的内存区域清零,然后从流中复制内存,例如
char* stream = ...;
Uint32 myInt;
bzero(myInt,4);
memcopy(myInt, stream[0], stream[3])
问题:
我将如何在Python中执行此操作?
干杯
答案 0 :(得分:3)
即使在C中,也不应该使用memcpy
进行二进制反序列化,因为它不处理二进制表示,即字节序,符号等。将二进制值从流中的固定表示显式解码为平台的本机表示。
在Python中,您将从流中读取字节,根据字节顺序填充它们,然后使用struct
解压缩它们:
chunk = fileobj.read(3)
# decode bytes as little-endian, signed integer
chunk += '\x00'
number = struct.unpack('<i', chunk)
fileobj
是一个类似文件的对象,代表打开的流,即用open(filename, 'rb')
打开的文件。
答案 1 :(得分:1)
你试过了吗?
myInt = (ord (myStr[0]) * 256 + ord (myStr[1])) * 256 + ord (myStr[2])
以下计划:
myStr = "abc"
myInt = ord (myStr[0]) * 65536 + ord (myStr[1]) * 256 + ord (myStr[2])
print myInt
按预期输出6382179
:
'a' (97) * 65536 = 6356992
'b' (98) * 256 = 25088
'c' (99) * 1 = 99
-------
6382179
当然,这是假设字符串采用大端格式。对于little-endian,其中最重要的八位字节是字符串中的 third ,您只需反转字符串索引(2, 1, 0
而不是0, 1, 2
)。
答案 2 :(得分:0)
正如@paxdiablo所说,ord
是解决方案。以下是使用<<
的解决方案,使其更熟悉C:
sum([ord(c) << 8 * i for i, c in enumerate(s) ])