2011-10-30 40 views
0

我不知道問題出在哪裏,但似乎當我通過引用傳遞'內存'時,它不起作用。我嘗試了2從內存中讀取Big Endian並增加內存

這裏讀一個字從大端和增量數據存儲器是我如何做到這一點

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的最佳方式嗎?

謝謝;

+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); 

如果你這樣做,你會看到,*數據[1]指向內存[ 1]。

然後到你的數據指針移動到下一個,你需要通過一個的sizeof WORD,不是char**大小是什麼++會做增加它的工作。

但正如其他人所說,你應該改變你的方法採取char*,然後擔心在調用的代碼中在緩衝區中移動。這將使您的功能更清晰,更清晰。

0

嘗試增加的括號Data,就像這樣:

WORD Result = (unsigned char) (*Data)[0]; 
(*Data)++; 

但是,如果這樣的事情的指針到指針迷惑你,你最好寫在一個更簡單的方法的代碼,就像已經一個函數讀取的數據,另一個增加指針。實際上,單獨做不相關的事情通常會更好,通常在代碼中應避免使用**

此外,您還可以使用以下命令:

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