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

标签 c++ pointers arrays reverse endianness

我正在使用规范解析二进制文件。该文件采用大端模式,因为它累积了流式数据包。我必须反转数据包的长度,以便将它们“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/

相关文章:

c++ - 如何在计算单应性后拼接两个图像

c - 在C警告消息中将数组作为双指针传递

c++ - 我将如何在 C++ 中初始化一个映射数组?

Javascript - 从 JSON 数组中删除对象

java - 数组中整数的总和

c++ - 在调用 C++ 运算符重载时识别调用上下文/用法

c++ - Visual C++ 不会创建 dll 文件并在 *.lib 处停止

强制转换/访问相同的内存是 C 中的不同变量

c++ - boost/asio : Very simple chat server can't access the messages that are recieved

c - 不在 if 语句之外打印