2013-07-10 54 views
0

我的機器是64位。我的代碼如下:獲取網絡5字節警告左移計數> =寬度類型

unsigned long long periodpackcount=*(mBuffer+offset)<<32|*(mBuffer+offset+1)<<24|*  (mBuffer+offset+2)<<16|*(mBuffer+offset+3)<<8|*(mBuffer+offset+4); 

mBuffer是無符號字符*。我想獲得5個字節的數據並將數據轉換爲主機字節順序。 如何避免此警告?

+0

-1:你有什麼試過?什麼是警告?移位值溢出? –

+0

警告警告:左移count> = type的寬度。我改變了代碼,如0x00ULL | *(mBuffer + offset)<< 32 | *(mBuffer + offset + 1)<< 24 | *(mBuffer + offset 2)<< 16 | *(mBuffer +偏移+ 3)<< 8 | *(mBuffer +偏移+ 4); – Ericzhang88120

回答

0

有時最好分解成幾行以避免問題。你有一個5字節的整數你想讀。

// Create the number to read into. 
uint64_t number = 0; // uint64_t is in <stdint> 
char *ptr = (char *)&number; 

// Copy from the buffer. Plus 3 for leading 0 bits. 
memcpy(ptr + 3, mBuffer + offset, 5); 

// Reverse the byte order. 
std::reverse(ptr, ptr + 8); // Can bit shift here instead 

可能不是有史以來最好的字節交換(位移快)。而我的邏輯可能會被抵消,但沿着這些線應該工作。

您可能想要做的另一件事是在轉換之前先轉換每個字節,因爲您將其留給編譯器來確定數據類型*(mBuffer + offset)是一個字符(我相信),因此您可能想要將其轉換爲更大的類型static_cast<uint64_t>(*(mBuffer + offset)) << 32什麼的。