将C&f的fread转换为python,而不是获得预期的输出

时间:2015-02-26 18:03:07

标签: python c struct

我正在努力将一个小程序从C转换为Python,而我却无法读取该文件。它是一个.dat文件,数据为十六进制格式。这是我尝试阅读的前132个字节

2400 0000 4c61 7a61 726f 2053 756e 6965
7200 ffff 0000 0000 7261 6a70 6f6f 7420
6279 776f 726b 2069 7363 6869 6f70 7562
6963 2073 6872 6f76 6574 6964 6520 6469
7373 7561 5275 746c 616e 642c 5665 726d
6f6e 742c 0d00 0000 7000 0000 0000 0000
0000 0000 0000 0000 4000 0000 0000 0000
ffff ffff 656e 2073 6f76 6572 6f62 6564
6965 6e74

要读取它的C代码打开fp中的文件,并按此读取。

TEXT_SHORT = 64;

fread(&(record->id), sizeof(int), 1, fp);
fread(&(record->name[0]), sizeof(char), TEXT_SHORT, fp);
fread(&(record->location[0]), sizeof(char), TEXT_SHORT, fp);

printf("%06d\n", record->id);
printf("%s\n", record->name);
printf("%s\n", record->location);

然后在打印值时,我得到了这个:

36
Lazaro Sunier
Rutland,Vermont,

要将此功能转换为Python,我编写了以下代码:

def read_file(file):
    id = struct.unpack('i', file.read(4))[0]
    name = ''.join(struct.unpack('c'*64, file.read(64)))
    location = ''.join(struct.unpack('c'*64, file.read(64)))
    print(id)
    print(name)
    print(location)

然后我得到了这个输出

36
Lazaro Sunier��rajpoot bywork ischiopubic shrovetide dissua
p@����en soverobedient

我一直在努力解决这个问题,并且不知道为什么会发生这种情况。有没有fread()做的事情是我需要在Python中实现的背景,还是我做错了?

1 个答案:

答案 0 :(得分:5)

虽然您在C和Python中都在读取64字节块,但Python没有\x00这样的字符串终结符。因此,虽然C中的printf将打印到第一个\0,但Python将打印整个缓冲区,包括尾随垃圾。

只需将字符串拆分为\0,只保留第一部分:

name = name.split(b"\0", 1)[0]
location = name.split(b"\0", 1)[0]

顺便说一句,您可以在一行中检索3个元素:

id, name, location = struct.unpack("i64s64s", file.read(132))
name = name.split(b"\0", 1)[0]
location = name.split(b"\0", 1)[0]