gpt4 book ai didi

c++ - 如何使用指针数组反转数据(解析二进制文件)

转载 作者:行者123 更新时间:2023-11-28 03:57:02 24 4
gpt4 key购买 nike

我正在使用规范解析二进制文件。该文件采用大端模式,因为它累积了流式数据包。我必须反转数据包的长度,以便将它们“reinterpret_cast”为正确的变量类型。 (我无法使用 net/inet.h 函数,因为数据包的长度不同)。

ifstream 类的 read() 方法将字节放入图表指针数组中。我尝试使用 a 手动进行还原,但我不知道如何传递“指针列表”以更改它们在数组中的位置。

如果有人知道更有效的方法,请告诉我(需要解析 8gb 的数据)。

#include <iostream>
#include <fstream>

void reverse(char &array[]);

using namespace std;

int main ()
{
char *a[5];
*a[0]='a'; *a[1]='b'; *a[2]='c'; *a[3]='d'; *a[4]='e';

reverse(a);

int i=0;
while(i<=4)
{
cout << *a[i] << endl;
i++;
}
return 0;
}
void reverse(char &array[])
{
int size = sizeof(array[])+1;
//int size = 5;
cout << "ARRAY SIZE: " << size << endl;

char aux;
for (int i=0;i<size/2;i++)
{
aux=array[i];
array[i]=array[size-i-1];
array[size-i-1]=aux;
}
}

感谢大家的帮助!

最佳答案

不完全是。

The file comes in big-endian mode because it has streamed packets accumulated. I have to reverse the length of the packets in order to "reinterpret_cast" them into the right variable type.

您需要在存储数据级别反转字节,而不是文件和数据包。

例如,如果一个文件存储一个结构。

struct S {
int i;
double d;
char c;
};

要读取您需要反转的结构:

int: [4321]->[1234]  // sizeof(int) == 4, swap the order of 4 bytes
double: [87654321]->[12345678] // sizeof(double) == 8, swap the order of 8 bytes
char: [1]->[1] // sizeof(char) == 1, swap 1 byte (no swapping needed)

不是一次整个结构。

不幸的是,它不像仅仅反转文件中的数据 block 或文件本身那么简单。您需要确切地知道正在存储什么数据类型,并反转其中的字节。

inet.h 中的函数正是用于此目的,因此我鼓励您使用它们。

所以,这将我们带到了 C 字符串。如果将 c 字符串存储在文件中,是否需要交换它们的字节顺序?好吧,C 字符串是 1 字节 char 的序列。您不需要交换 1 个字节的 char,因此您不需要交换 c 字符串中的数据!

如果你真的想交换 6 个字节,你可以使用 std::reverse 函数:

char in[6] = get6bytes();
cout << in << endl; // shows abcdef
std::reverse(in, in+6);
cout << in << endl; // shows fedcba

如果您在任何大规模(大量类型)上执行此操作,那么您可能需要考虑编写一个代码生成器来生成这些字节交换函数(和文件读取函数),这不是 很难,只要你能找到一个工具来解析 c 中的结构(我为此使用了 gcc-xml,或者也许 clang 会有所帮助)。

这使得序列化成为一个更难的问题。如果力所能及,您可能需要考虑使用 XML 或 Google 的 Protocol Buffer 来为您解决这些问题。

关于c++ - 如何使用指针数组反转数据(解析二进制文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3125552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com