2014-09-01 110 views
3

我有一個字節向量,我想將它們轉換爲四字數據類型(64位小端)。矢量的向四字節的字節向量

例如雙字(32位):

int DataConversor::toDword() 
{ 
    return ((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3])); 
} 

問題根據Visual Studio中2013其未定義的行爲與多於32個字節移位:

__int64 DataConversor::toQuadWord() 
{ 
    return (__int64)((data[0] << 64 | data[1] << 56 | data[2] << 48 | data[3] << 40 | 
     data[4] << 32 | data[5] << 24) | (data[6] << 16) | (data[7] << 8) | (data[8])); 
} 

爲實現此目的的任何方法,沒有使用_ASM指令?

回答

4

好,data[0] << 64可能是一個意外......

data[0] << 56是不是你想要的。你想要static_cast<uint64_t>(data[0]) << 56。然後再重複所有其他操作。

因此,你希望你的函數看起來像:

int64_t DataConversor::toQuadWord() { 
    uint64_t result = 0; 
    result |= static_cast<uint64_t>(data[0]) << 56; 
    result |= static_cast<uint64_t>(data[1]) << 48; 
    result |= static_cast<uint64_t>(data[2]) << 40; 
    result |= static_cast<uint64_t>(data[3]) << 32; 
    result |= static_cast<uint64_t>(data[4]) << 24; 
    result |= static_cast<uint64_t>(data[5]) << 16; 
    result |= static_cast<uint64_t>(data[6]) << 8; 
    result |= static_cast<uint64_t>(data[7]) << 0; 
    return (int64_t) result; 
} 
1

沒有編譯器獨立的方式。您可以使用GCC上的int64_t __builtin_bswap64 (int64_t x)和MSVC上的unsigned __int64 _byteswap_uint64(unsigned __int64 value)來交換字節序。你可以使用它,如果你的數組根據定義在任何地方都是一個大端(至少它不會改變其他系統上的端點)。您必須將類型轉換爲64位整數。

int64_t convertEndianess(uint8_t x[]) 
{ 
    return _byteswap_uint64(*static_cast<int64_t*>(x)); 
} 
+0

如果'x'不是64位對齊,一些處理器將爲此執行無效的代碼。例如,[這個處理器將](http://www.ti.com/product/tms320c6657)。 – 2014-09-01 12:38:30

-1

隨着小端,你知道的字節打包,你可以做

return *reinterpret_cast<int64_t*>(&data[0]) ; 
+0

如果'x'不是64位對齊,某些處理器將爲此語句執行無效代碼。你可能的意思是'int64_t'而不是'int64_6'。 – 2014-09-01 12:40:01