【发布时间】:2019-05-11 17:22:42
【问题描述】:
我正在将 C++ 和 Python 中的文件作为二进制文件读取。我需要将二进制文件分成块,每块 6 个字节。例如,如果我的文件是 600 字节,结果应该是 100 块,每块 6 字节。
我已经尝试过结构(在 C++ 和 Python 中)和数组(Python)。它们都没有将二进制文件分成 6 个字节的块。他们只能将二进制分成每个 2 的幂(1、2、4、8、16 等)的块。
数组算法非常快,可以在不到一秒的时间内以 4 字节块的形式读取 1 GB 的二进制数据。相比之下,我用了一些其他的方法,但是都非常慢,几十分钟就搞定了几兆。
如何尽可能快地将二进制文件读取为 6 个字节的块? C++ 或 Python 中的任何帮助都会很棒。谢谢。
编辑 - 代码:
struct Block
{
char data[6];
};
class BinaryData
{
private:
char data[6];
public:
BinaryData() {};
~BinaryData() {};
void readBinaryFile(string strFile)
{
Block block;
ifstream binaryFile;
int size = 0;
binaryFile.open(strFile, ios::out | ios::binary);
binaryFile.seekg(0, ios::end);
size = (int)binaryFile.tellg();
binaryFile.seekg(0, ios::beg);
cout << size << endl;
while ( (int)binaryFile.tellg() < size )
{
cout << binaryFile.tellg() << " , " << size << " , " <<
size - (int)binaryFile.tellg() << endl;
binaryFile.read((char*)block.data,sizeof(block.data));
cout << block.data << endl;
//cin >> block.data;
if (size - (int)binaryFile.tellg() > size)
{
break;
}
}
binaryFile.close();
}
};
注意事项:
【问题讨论】:
-
你试过读入
unsigned char[6]吗? -
在不知道自己真正想要实现的目标的情况下,很难给出合适的解决方案。如果您通过
data = open(filename, "rb").read()(或类似方式)读取文件,您将获得一个字节串,并且使用[data[i:i+n] for i in range(0, len(data), n)]之类的内容,您可以获得一个拆分列表,或者您可以通过data[i*width:(i+1)*width]直接寻址每个块。但我的直觉告诉我,你试图以一种非常不合常规的方式解决问题。尤其是由于 python 不喜欢迭代任务,即如果执行不当会非常慢。 -
@RichardCritten 我已将代码作为图像附加到帖子中。
-
@ChristianB.我想将二进制分成6字节的块,然后比较它们的值并按升序排序。
-
@Behzad 数据应该是什么,一个 6 字节的数字?如果是的话,小/大端呢?
cout << block.data << endl令人惊讶