2010-11-10 65 views
2

我有一個8字節的數組,我試圖將它轉換爲C++中的一個長符號,似乎無法弄清楚。從我可以告訴長整數只有4個字節,任何人都可以提供這方面的一些信息?如果它是32位或64位,會不會很重要?將8個字節的數組轉換爲C++中的長符號

+0

發表更多你想要實現的,可能用一個例子什麼位。 – 2010-11-10 07:49:45

+1

另請參閱:http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and-a-long-in-c和http://stackoverflow.com/questions/ 589575/c-size-of-int-long- – thomaspaulb 2010-11-10 07:59:45

+0

儘管它們通常僅適用於16位和32位值,但您可能會發現與「ntohl」系列函數有一些相似之處。對於Linux/GCC,它們是通過位/ byteswap.h實現的,該位也具有__bswap_64,儘管這非常不標準,但它說明了對英特爾的bswap彙編語言指令的使用,以及針對較舊的CPU的rorw/rorl。在FreeBSD上,有一個sys/endian.h頭文件。 – 2010-11-10 08:15:10

回答

0

一些長整數是8個字節,一些是4個.8個字節的變體通常只存在於64位系統上。如果你想得到一個想法,請檢查this page

當然,我們不知道你的情況是什麼,所以你必須發佈更多的細節。

爲了安全起見,您可以決定將8個字節放入2個長整數中。那樣,它會一直工作。在最糟糕的情況下,你會浪費一半的存儲空間。

+1

8字節的變體不一定只存在於64位系統上。 – aib 2010-11-10 08:05:15

8

你可能應該使用int64_t這是保證是8字節長。

你沒有說明你的數據如何被表示(它的字節順序)到你的數組中,但你可能使用reinterpret_cast<>甚至更​​好:使用移位操作來「建立」你的整數。

喜歡的東西:

unsigned char array[8] = { /* Some values here */ }; 
uint64_t value = 
    static_cast<uint64_t>(array[0]) | 
    static_cast<uint64_t>(array[1]) << 8 | 
    static_cast<uint64_t>(array[2]) << 16 | 
    static_cast<uint64_t>(array[3]) << 24 | 
    static_cast<uint64_t>(array[4]) << 32 | 
    static_cast<uint64_t>(array[5]) << 40 | 
    static_cast<uint64_t>(array[6]) << 48 | 
    static_cast<uint64_t>(array[7]) << 56; 
+0

「長」至少有4個字節長。它可以更多。很多,更多。 – aib 2010-11-10 08:00:15

+0

@aib:我在我的例子中使用了'uin64_t',而不是'long'。爲什麼downvote? – ereOn 2010-11-10 08:01:00

+0

你做了,但你改變了你的答案。聰明:) – thomaspaulb 2010-11-10 08:02:54

0

只有C99保證了持有的64位信息類型 -​​ long longint*64_t。對於C++,你應該尋找一個BigInt類/庫。或者,如已經建議的那樣,使用兩個longs來滾動你自己的班級。

2

另一種在數據類型之間進行轉換的方式,在某些情況下我覺得很方便,就是使用union數據類型,它允許您訪問與不同數據類型相同的內存部分。當然,關於字節順序,數據類型大小等的所有其他評論仍然存在。

例如:

union bytes { 
    unsigned char c[8]; 
    uint64_t l; 
} myb; 
myb.c[0] = 0; 
myb.c[1] = 1; 
myb.c[2] = 0; 
myb.c[3] = 0; 
myb.c[4] = 0; 
myb.c[5] = 0; 
myb.c[6] = 0; 
myb.c[7] = 0; 
cout << "value of myb.l: " << myb.l << "\n"; 
相關問題