c - 从内存中读取 Big Endian 并增加内存

标签 c gcc endianness

我不知道问题到底出在哪里,但似乎当我通过引用传递“内存”时,它不起作用。我正在尝试以大尾数法从内存中读取一个单词并将数据递增 2

这是我的做法

WORD ReadBigEndianWORD(char **Data)
{
    WORD Result = (unsigned char) *Data[0];
    Result <<= 8;
    Result |= (unsigned char) *Data[1];
    *Data++
    return Result;
}

我这样调用它

char *Memory = ........;
WORD MyWord = ReadBigEndianWORD(&Memory);

上面的代码不起作用(如果函数参数是“char *Data”并且数据作为“Memory”传递,则有效);

这是从内存中读取 Big Endian 的最佳方式吗?

谢谢;

最佳答案

由于 * 运算符和 [] 操作的运算优先级,您的代码失败。 [] 具有更高的优先级,因此您需要将代码更改为:

WORD ReadBigEndianWORD(char **Data)
{
    WORD Result = (unsigned char) (*Data)[0];
    Result <<= 8;
    Result |= (unsigned char) (*Data)[1];
    (*Data) += sizeof(WORD);
    return Result;
}

带有 *Data[0] 的行最终可以正常工作,因为您添加了零偏移量。第二个 *Data[1] 要么会使我们给您的错误数据崩溃,因为它正在读取未初始化的内存。 *Data[1] 相当于 \*(\*(Data + sizeof(char**))),因此它会定位 Memory 的存储位置,并且过去了。

查看发生情况的最佳方法是使用原始的 ReadBigEndianWORD 并将调用代码更改为:

char *Memory[2] = { "........", ",,,,,,,,," };
short Myshort = ReadBigEndianshort(Memory);

如果这样做,您将看到 *Data[1] 指向 Memory[1]。

然后要将数据指针移动到下一个工作,您需要将其增加 WORD 的大小,而不是 char** 的大小,这就是++就可以了。

但正如其他人所说,您应该更改方法以采用 char* ,然后担心在调用代码中的缓冲区中移动。这将使您的功能更加清晰。

关于c - 从内存中读取 Big Endian 并增加内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7946374/

相关文章:

c++ - 有没有一种方法可以使用 C/C++ 程序检测网络路由器是否支持 DHCP?

mysql - CentOS:mysqlclient 库

c - 从 unsigned char 读取 N 位时字节顺序是否重要

c++ - 在内存映射文件中交换字节的有效方法

python - 使用cython将numpy数组列表传递给C

类平均与功能和结构

c - 在程序运行时分配内存

c++ - 如何显示cmake的gcc版本?

gcc - 如何在编译时删除 `GLIBC_2.27' 要求?

c++ - 有没有办法为 C 或 C++ 结构强制执行特定的字节顺序?