Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换C';s fread到python,未获得预期输出_Python_C_Struct - Fatal编程技术网

转换C';s fread到python,未获得预期输出

转换C';s fread到python,未获得预期输出,python,c,struct,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

我正在将一个小程序从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

我已经为此挣扎了一段时间,不知道为什么会发生这种情况。我需要在Python中实现fread()的后台功能,还是我做得不对?

虽然您在C和Python中都读取64字节的块,但Python没有字符串终止符之类的东西。因此,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]

尽管您在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]

这并不是导致错误的原因,但是在您的行
name=name=''.join(struct.unpack('c'*64,file.read(64))
中,您可以删除重复的
name=
语句之一。谢谢。这是一个复制错误。请尝试打印
repr(名称)
repr(位置)
很可能您的终端不支持奇怪的字符。。。与python无关这不会导致您的错误,但是在您的行
name=name=''.join(struct.unpack('c'*64,file.read(64))
中,您可以删除重复的
name=
语句之一。谢谢。这是一个复制错误。请尝试打印
repr(名称)
repr(位置)
很可能您的终端不支持奇怪的字符。。。与python完全无关。另外,您可以让struct计算要读取的缓冲区大小:
my_struct=struct.struct(“i64s64s”)
\u id,name,location=my_struct.unpack(f.read(my_struct.size))
!非常感谢你。我不知道有一个终结者,只是为了唠叨
name.split(b“\0”,1)[0]
速度稍快,因为它在第一个元素之后停止分裂。此外,您可以让struct计算要读取的缓冲区大小:
my_struct=struct.struct(“i64s64s”)
\u id,name,location=my_struct.unpack(f.read(my_struct.size))
!非常感谢你。我不知道有一个终结者,只是为了唠叨
name.split(b“\0”,1)[0]
速度稍快,因为它在第一个元素之后停止分裂。