2024-05-23 15:10:37 发布
网友
我有一个3字节的字节流,我必须把它转换成一个无符号int32。在C语言中,我只需要使用bzero将整数的内存区域归零,然后从流中复制内存,类似于
char* stream = ...; Uint32 myInt; bzero(myInt,4); memcopy(myInt, stream[0], stream[3])
问题:
在Python中我该怎么做呢?在
干杯
您是否尝试过:
myInt = (ord (myStr[0]) * 256 + ord (myStr[1])) * 256 + ord (myStr[2])
以下程序:
按预期输出6382179:
6382179
'a' (97) * 65536 = 6356992 'b' (98) * 256 = 25088 'c' (99) * 1 = 99 - 6382179
当然,这是假设字符串是big-endian格式。对于little endian,其中最重要的八位字节是字符串中的第三个,您只需反转字符串索引(2, 1, 0,而不是0, 1, 2)。在
2, 1, 0
0, 1, 2
即使在C语言中,也不应该使用memcpy进行二进制反序列化,因为它不处理二进制表示,即endianess、sign等。将二进制值从流中的固定表示形式显式解码为平台的本机表示形式。在
memcpy
在Python中,您将从流中读取字节,根据endianess填充它们,然后使用struct将它们解包:
struct
chunk = fileobj.read(3) # decode bytes as little-endian, signed integer chunk += '\x00' number = struct.unpack('<i', chunk)
fileobj是一个类似文件的对象,表示打开的流,即用open(filename, 'rb')打开的文件。在
fileobj
open(filename, 'rb')
正如@paxdiablo所说,ord是解决方案。下面是一个使用<<的解决方案,它更熟悉C:
ord
<<
sum([ord(c) << 8 * i for i, c in enumerate(s) ])
您是否尝试过:
以下程序:
^{pr2}$按预期输出
6382179
:当然,这是假设字符串是big-endian格式。对于little endian,其中最重要的八位字节是字符串中的第三个,您只需反转字符串索引(
2, 1, 0
,而不是0, 1, 2
)。在即使在C语言中,也不应该使用
memcpy
进行二进制反序列化,因为它不处理二进制表示,即endianess、sign等。将二进制值从流中的固定表示形式显式解码为平台的本机表示形式。在在Python中,您将从流中读取字节,根据endianess填充它们,然后使用
struct
将它们解包:fileobj
是一个类似文件的对象,表示打开的流,即用open(filename, 'rb')
打开的文件。在正如@paxdiablo所说,
ord
是解决方案。下面是一个使用<<
的解决方案,它更熟悉C:相关问题 更多 >
编程相关推荐