读取 64 位整数二进制文件

Reading 64 bit integers binary file

本文关键字:二进制文件 整数 读取      更新时间:2023-10-16

我要求通过获取 64 位大小的块来读取二进制文件的正确方法。我目前正在这样做:

    uint64_t uInt;
    char c;
    if(istr)
  {
    while (true)
    {
        istr.get(c);
        if (istr.eof())
            break;
        istr.putback(c);
        istr.read(reinterpret_cast<char *>(&uInt), sizeof(uInt));
        tea.encryptBlock(uInt, ostr);
    }
  }

istr 和 ostr 是我想要读/写的文件的流。虽然它在调试时适用于文件的大部分,但我使用了二进制查看器,似乎最后 32 位是错误的(我需要它们,因为我正在尝试使用微小的加密算法进行加密/解密,该算法使用 64 位块分成两半(。我不确定是什么导致了这个问题,我想也许我应该尝试只读取字符,然后使用这样的东西组合它们:

  int64_t charTo64bitNum(char *a) {
  int64_t n = 0;
  n = (((int64_t)a[0] << 56) & 0xFF00000000000000U)
    | (((int64_t)a[1] << 48) & 0x00FF000000000000U)
    | (((int64_t)a[2] << 40) & 0x0000FF0000000000U)
    | (((int64_t)a[3] << 32) & 0x000000FF00000000U)
    | ((a[4] << 24) & 0x00000000FF000000U)
    | ((a[5] << 16) & 0x0000000000FF0000U)
    | ((a[6] << 8) & 0x000000000000FF00U)
    | (a[7] & 0x00000000000000FFU);
    return n;
 }

但它似乎不起作用。

尝试从文件中读取 8 个字节的块到 uint8_t buff[8] ,然后执行

   uint8_t buff[] = { 0,1,2,3,4,5,6,7 };
   uint64_t val = (uint64_t)buff[7] 
                  | ((uint64_t)buff[6] << 8) 
                  | ((uint64_t)buff[5] << 16) 
                  | ((uint64_t)buff[4] << 24) 
                  | ((uint64_t)buff[3] << 32) 
                  | ((uint64_t)buff[2] << 40) 
                  | ((uint64_t)buff[1] << 48) 
                  | ((uint64_t)buff[0] << 56);
  // buff == 0x0001020304050607LL
  // to split:
  uint32_t val1 = (uint32_t)(val & ((1 << 32) - 1));
  uint32_t val2 = (uint32_t)(val >> 32);

更新:反转指数

//[0]83 [1]111 [2]109 [3]101 [4]32 [5]116 [6]101 [7]120
uint8_t arr[] = { 83, 111, 109, 101, 32, 116, 101, 120 };
uint64_t expected = 8675467939688574803;
uint64_t val = (uint64_t)arr[0] 
    | ((uint64_t)arr[1] << 8) 
    | ((uint64_t)arr[2] << 16) 
    | ((uint64_t)arr[3] << 24) 
    | ((uint64_t)arr[4] << 32) 
    | ((uint64_t)arr[5] << 40) 
    | ((uint64_t)arr[6] << 48) 
    | ((uint64_t)arr[7] << 56);