我不知道问题到底在哪里,但是当我通过引用传递'Memory'时,它似乎不起作用。我试图从Big Endian的内存中读取一个单词并将数据增加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);
上面的代码不起作用(如果Function Argment是'char * Data'而数据传递为'Memory');
这是从记忆中读取Big Endian的最好方法吗?
感谢;
答案 0 :(得分:2)
由于*
运算符和[]
运算的运算优先级,您的代码失败了。 []
具有更高的优先级,因此您需要将代码更改为:
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**)))
,因此它正在确定存储内存并移过该位置的位置。
查看正在发生的事情的最佳方法是使用原始ReadBigEndianWORD
并将调用代码更改为:
char *Memory[2] = { "........", ",,,,,,,,," };
short Myshort = ReadBigEndianshort(Memory);
如果你这样做,你会看到* Data [1]指向Memory [1]。
然后将数据指针移动到下一个工作,您需要将其增加WORD
的大小,而不是char**
的大小++
。< / p>
但正如其他人所说,你应该改变你的方法来取char*
,然后担心在调用代码中移动你的缓冲区。这将使您的功能更清晰,更清晰。
答案 1 :(得分:0)
尝试在Data
周围添加括号,如下所示:
WORD Result = (unsigned char) (*Data)[0];
(*Data)++;
但是如果像指针这样的东西让你感到困惑,你最好用更简单的方式编写代码,比如让一个函数读取数据,另一个函数增加指针。实际上,分别做不相关的事情通常会更好,而且通常在代码中避免使用**
。
此外,您可以使用以下内容:
WORD ReadBigEndianWORD(unsigned char *Data)
{
return (Data[0] << 8) | Data[1];
}