用Python替代C++读取二进制文件

2024-10-01 04:44:18 发布

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

我有一个二进制文件和C++代码,可以读取如下的二进制文件。你知道吗

int NumberOfWord;
FILE *f = fopen("../data/vec.bin", "rb");
fscanf(f, "%d", &NumberOfWord);
cout << NumberOfWord< <endl;

此输出为:

114042

我想用python重新实现上面的代码。你知道吗

with open("../data/vec.bin","rb") as f:
    b = f.read(8)
    print struct.unpack("d",b)[0]

但是这个代码不起作用。 我的输出是:

8.45476330511e-53

我的问题是:

<整数>为什么在C++中有8字节。你知道吗

我从来不知道%d意味着加倍。 但是,实际上变量有一个整数类型,但是通常我们在C++中使用“%d”输出。 很奇怪。你知道吗

2)如何在python中提取实数

我想在Python代码中提取一个类似于C++代码的实数。 我该怎么做??你知道吗

也许,我误解了python中的struct模块。你知道吗


Tags: 文件代码databin二进制structfileint
2条回答

在C格式的字符串中,%d是十进制的缩写。你知道吗

在Python中,d是double的缩写。你知道吗

如果它是整数,则应该在struct.unpack调用中使用i。你知道吗

with open("../data/vec.bin","rb") as f:
    b = f.read()
    print struct.unpack("i",b)[0]
<>你可以用这个C++(或相当的C)行,^ {< CD1>}来正确读取文件,我假设你的文件包含114042的文本表示。所以它包含字节

0x31 0x31 0x34 0x30 0x34 0x32 ...'1', '1', '4', '0', '4', '2', ...

在文本编辑器中打开它时,可以看到一行114042。你知道吗

现在,当您尝试将if作为i格式的二进制文件读取时,使用文件的前4个字节,实际得到int('31313034', 16):825308208。我无法复制用d格式解码它的结果,因为我猜不出文件中最后一个数字之后会出现什么。。。你知道吗

如果第一行只有一个数字,很简单:只需读取一行并将其转换为int:

with open("../data/vec.bin","rb") as f:
    print int(f.readline())

如果最后一个数字后面还有其他字符,则必须首先使用regex(不要忘记导入re)获取数值,然后将其转换为int:

with open("../data/vec.bin","rb") as f:
    line = f.readline()
    m = re.match(t'\s*\d*', line)
    print(int(m.group(0)))

TL/DR:不要试图像读取包含二进制表示的文本文件那样读取它

相关问题 更多 >