簡體   English   中英

在C ++中將8字節的數組轉換為帶符號的long

[英]Convert array of 8 bytes to signed long in C++

我有一個8字節的數組,我正在嘗試將其轉換為C ++中的有符號長整數,似乎無法弄明白。 據我所知,長整數只有4個字節,有人可以提供一些信息嗎? 如果它是32位還是64位是否重要?

你可能應該使用一個保證長度為8個字節的int64_t

您沒有說明數據如何表示(它的字節順序)到您的數組中,但您可以使用reinterpret_cast<>甚至更好:使用shift操作來“構建”整數。

就像是:

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;

在某些情況下我覺得很方便的數據類型之間的另一種轉換方法是使用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";

為什么不像以下那樣?

uint8_t start_arr[8] = {0,1,2,3,4,5,6,7};
uint64_t val = (uint64_t)(*(uint64_t*)&start_arr[0]);
std::cout << std::hex << val << std::endl;

一些長整數是8個字節,有些是4. 8字節變體通常僅存在於64位系統上。 如果您想了解,請查看此頁面

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

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

只有C99的類型保證能容納64位信息 - long longint*64_t 對於C ++,您應該查找BigInt類/庫。 或者,正如已經建議的那樣,使用兩個long來滾動你自己的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM