将3字节字符复制到

2024-05-23 15:10:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个3字节的字节流,我必须把它转换成一个无符号int32。在C语言中,我只需要使用bzero将整数的内存区域归零,然后从流中复制内存,类似于

char* stream = ...;
Uint32 myInt;
bzero(myInt,4);
memcopy(myInt, stream[0], stream[3])

问题:

在Python中我该怎么做呢?在

干杯


Tags: 内存区域stream字节符号整数charuint32
3条回答

您是否尝试过:

myInt = (ord (myStr[0]) * 256 + ord (myStr[1])) * 256 + ord (myStr[2])

以下程序:

^{pr2}$

按预期输出6382179

'a' (97) * 65536 = 6356992
'b' (98) *   256 =   25088
'c' (99) *     1 =      99
                      -
                   6382179

当然,这是假设字符串是big-endian格式。对于little endian,其中最重要的八位字节是字符串中的第三个,您只需反转字符串索引(2, 1, 0,而不是0, 1, 2)。在

即使在C语言中,也不应该使用memcpy进行二进制反序列化,因为它不处理二进制表示,即endianess、sign等。将二进制值从流中的固定表示形式显式解码为平台的本机表示形式。在

在Python中,您将从流中读取字节,根据endianess填充它们,然后使用struct将它们解包:

chunk = fileobj.read(3)
# decode bytes as little-endian, signed integer
chunk += '\x00'
number = struct.unpack('<i', chunk)

fileobj是一个类似文件的对象,表示打开的流,即用open(filename, 'rb')打开的文件。在

正如@paxdiablo所说,ord是解决方案。下面是一个使用<<的解决方案,它更熟悉C:

sum([ord(c) << 8 * i for i, c in enumerate(s) ])

相关问题 更多 >