代码之家  ›  专栏  ›  技术社区  ›  Bob Bobbio

在C++中将8字节数组转换为签名长

  •  2
  • Bob Bobbio  · 技术社区  · 14 年前

    5 回复  |  直到 8 年前
        1
  •  8
  •   ereOn    14 年前

    你应该用一个 int64_t 保证8字节长。

    您不需要说明数据在数组中的表示方式(它的结束性),但是您可以使用 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;
    
        2
  •  2
  •   Itamar Katz    14 年前

    例如:

    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";
    
        3
  •  2
  •   Paul Roub Mark Dail    6 年前

    为什么不做如下的事情呢?

    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;
    
        4
  •  0
  •   aib    14 年前

    只有C99的类型保证能保存64位的信息- long long int*64_t . 对于C++,应该查找BigIt类/库。或者,正如所建议的,用两个 long s。

        5
  •  0
  •   littlegreen    14 年前

    this page 如果你想知道的话。

    为了安全起见,您可以决定将8个字节放入两个长整数中。那样的话,它总是会起作用的。最坏的情况是你会浪费一半的存储空间。