![](/img/trans.png)
[英]Reading a Binary File that was generated with C++ data types Using Numpy
[英]Reading int from binary file incorrect when using c++
我有一个复杂的结构化二进制文件。 我在python中创建了一个解析器,以读取二进制文件并将其转换为正确的值,然后将数据保存到csv,以便可以分析这些值。 这很好用,但是某些文件非常大(即20+ Gb),并且要花很多小时才能解析。 我试图通过在c ++中实现相同的过程来加快速度。
下面的摘录在每个逻辑记录的开头读取一个控制字并指定记录的大小。 对于特定情况,控制字为128(4字节,Big Endian,int)。 在python中,我这样做:
x = open(str(self.filename), "rb")
cw_d_type = np.dtype('>i4')
temp = np.frombuffer(x.read(cw_d_type.itemsize), dtype=cw_d_type)
temp [0]之后的值是128。现在,当我尝试使用以下代码在c ++中执行相同的操作时
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <sstream>
#include <stdint.h>
using namespace std
struct control_word
{
uint32_t chunk_size;
}
int main()
{
// define my stream
ifstream in_f("Y:/path_to_binary_file/binary_file", ios::binary | ios::in | ios::ate);
// find the size of the file
int file_size = in_f.tellg();
// goto the beginning of the file
in_f.seekg(0, std::ios::beg);
in_f.read(reinterpret_cast<char*>(&cw), sizeof(cw));
cout << cw.chunk_size << endl
... continue reading the rest of the structures
}
cw.chunk_size = 2147483648的结果。我知道我正在读取文件b / c中的正确位置,如果我不在正确的位置,则我读取的下一个结构具有32位字符串,并且可以正确读取它。在文件中,那么结果将不正确。
如果我将控制字的结构从int
更改为char[4]
则结果为[0][0][0][-128]
,除负号外几乎都是正确的。
我读过的所有双打和浮球都显示相同的内容。 似乎正确读取的唯一内容是char
值。 自从我上一次使用c ++编程以来已经有很多年了。 有什么我忘记做的事情可以将我的二进制文件正确映射到我的结构中吗?
我已经阅读了许多有关读取二进制文件的问题,无法弄清楚为什么我得到这些奇怪的值。 我找到的最接近的答案是在这里 ,解决方案是用户没有将二进制代码块映射到正确的类型。 我知道在我的python实现中对b / c来说不是这种情况,我将块读取为int
并获得了我期望的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.