2015-10-06 71 views
0

我需要一個C++函數,它返回解釋爲bigendian long的四個連續字節的值。指向第一個字節的指針應該更新爲指向最後一個字節。我曾嘗試下面的代碼:在C++中轉換long-endian?

inline int32_t bigendianlong(unsigned char * &p) 
{ 
    return (((int32_t)*p++ << 8 | *p++) << 8 | *p++) << 8 | *p++; 
} 

例如,如果p指向00 00 00 A0我希望的結果是160,但它是0。何以見得?

+0

[ntohl()](http://pubs.opengroup.org/onlinepubs/9699919799/functions/ntohl.html)呢? –

+0

[將字節數組(char數組)轉換爲整數類型(short,int,long)]的可能重複(http://stackoverflow.com/questions/13678166/converting-byte-array-char-array-to-an -integer-type-short-int-long) –

+2

對'p'進行了多次修改,這些修改沒有相對於對方進行排序。這是未定義的行爲。 –

回答

2

的問題是由這個警告(由編譯器發出的)清楚地解釋:

./endian.cpp:23:25: warning: multiple unsequenced modifications to 'p' [-Wunsequenced] 
    return (((int32_t)*p++ << 8 | *p++) << 8 | *p++) << 8 | *p++; 

,以明確指定順序點打破邏輯的功能...

inline int32_t bigendianlong(unsigned char * &p) 
{ 
    int32_t result = *p++; 
    result = (result << 8) + *p++; 
    result = (result << 8) + *p++; 
    result = (result << 8) + *p++; 
    return result; 
} 

...將解決這個問題

+0

謝謝。我認爲括號會解釋明確的排序。我的編譯器不給出警告。 – PAF

+0

括號確保算術的順序,而不是++的副作用。該標準的措辭顯式允許實現在使用p之後和下一個序列點(逗號或分號)之前的任何時候應用後增量。羞愧你沒有警告。也許提高你的警告水平? –

0

這個函數在Unix和Windows上都被命名爲ntohl()(將網絡TO主機字節順序轉換爲長),或者g_ntohl()在glib。之後將4添加到您的指針。如果你想推出自己的,一個聯盟類型的成員是uint32_tuint8_t[4]將是有用的。