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