2013-08-31 18 views
1

如何將字節數組uint8_t[8]的八個值附加到一個變量uint64_t如何在C++中追加字節數據?

uint8_t array[8] = { 0xe4, 0x52, 0xcb, 0xbe, 0xa4, 0x63, 0x95, 0x8f }; 

uint64_t result = 0; 
for(int i = 0; i < sizeof(array); ++i) 
{ 
    // what to do here? 
} 

在上面的例子,result應該結束了的值0xe452cbbea463958f。我正在尋找一個通用的解決方案,它不會綁定到陣列中的八個元素。

+3

'result << = 8; result | = array [i];' – 2013-08-31 20:15:07

+0

@ H2CO3:是的,那樣做。一個人可以被拋到另一個嗎? –

+0

@RobertHarvey據我所知,沒有(嚴格的別名)。不過,如果機器是big-endian(現在不太可能),可以使用'memcpy()'。 – 2013-08-31 20:16:59

回答

3

如果你只是想在字節順序複製,最好的辦法是使用memcpy:

memcpy(&result, array, sizeof(array)); 

但是,如果你想解釋字節爲更大數量的部分,並把它們作爲如果他們在大端順序,你必須使用H2CO3的環路:

result = 0; 
for (int i=0; i<sizeof(array); i++) { 
    result <<= 8; 
    result |= array[i]; 
} 

如果你希望能夠使用相同的變量,無論是64位整數的字節數組,你可以簡單地類型化。或者如果你用C寫作,你可以使用聯盟。

union myBigInt { 
    uint8_t asBytes[8]; 
    uint64_t asLongInt; 
}; 
+1

從工會不活躍成員中讀取未定義的行爲。其他信息雖然不錯。 –

+0

@ BenVoigt這再一次在C中起作用,但在C++中不起作用。 :) – 2013-08-31 20:29:04

+0

哈,我的C++必須生鏽。太多的Javascript和Python。更正了我的答案。 – slashingweapon

3

這是怎麼了:

result <<= 8; 
result |= array[i]; 

|=運營商的意思是 「按位或後分配」。在result之後向左移動8個位置(<<=所做的),新的字節被插入到其末尾。