从记忆中读取Big Endian并增加记忆力

时间:2011-10-30 17:00:09

标签: c gcc endianness

我不知道问题到底在哪里,但是当我通过引用传递'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的最好方法吗?

感谢;

2 个答案:

答案 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];
}