【问题标题】:Convert char array to uint64_t array将 char 数组转换为 uint64_t 数组
【发布时间】:2021-05-16 06:05:11
【问题描述】:

我想将 unsigned char [32] 数组转换为 4 元素 uint64_t 数组。

我对 C++ 编码还很陌生,而且真的被卡住了。

unsigned char in_put [32] = { 1a, 2a, 3a, 4a, 5a, 6a, 7a, 8a, 1b, 2b, 3b, 4b, 5b, 6b, 7b, 8b, 1c, 2c, 3c, 4c, 5c, 6c, 7c, 8c, 1d, 2d, 3d, 4d, 5d, 6d, 7d, 8d }

我希望得到

uint64_t out_put [4] = { 0x1d2d3d4d5d6d7d8d, 0x1c2c3c4c5c6c7c8c, 0x1b2b3b4b5b6b7b8b, 0x1a2a3a4a5a6a7a8a }

最快、最便携的方式是什么?

【问题讨论】:

  • 谢谢,超级风暴。但这有点不同,因为它只有 8 个字节......
  • 是的应该是 uint64_t out_put [4]
  • 只做类似的事情,但有一个增量为 8 的外循环。
  • 您是否熟悉位运算符,例如<<|,并了解它们的工作原理和作用?

标签: c++


【解决方案1】:

我会写一个简单的函数:

inline uint64_t fourCh2uint64 (const unsigned char charArr[4]) {
    return  uint64_t(charArr[6]) << 56 | uint64_t (charArr[7]) << 48 |
            uint64_t(charArr[4]) << 40 | uint64_t (charArr[5]) << 32 |
            uint64_t(charArr[2]) << 24 | uint64_t (charArr[3]) << 16 |
            uint64_t(charArr[0]) << 8  | uint64_t (charArr[1]);
}

这是单个uint64。对于其中的 4 个,您可以使用:

char chArr[32] = {...}
uint64_t uintArr[4];
uintArr[0] = fourCh2uint64 (chArr);
uintArr[1] = fourCh2uint64 (chArr + 8);
uintArr[2] = fourCh2uint64 (chArr + 16);
uintArr[3] = fourCh2uint64 (chArr + 24);

这是整个程序:

#include <iostream>

inline uint64_t fourCh2uint64 (const unsigned char[4]);

int main (void) {
    unsigned char chArr [32] = {
        0x1a, 0x2a, 0x3a, 0x4a, 0x5a, 0x06a, 0x7a, 0x8a, 
            0x1b, 0x2b, 0x3b, 0x4b, 0x5b, 0x6b, 0x7b, 0x8b, 
                0x1c, 0x2c, 0x3c, 0x4c, 0x5c, 0x6c, 0x7c, 0x8c, 
                    0x1d, 0x2d, 0x3d, 0x4d, 0x5d, 0x6d, 0x7d, 0x8d
    };

    uint64_t uintArr[4];
    uintArr[0] = fourCh2uint64 (chArr);
    uintArr[1] = fourCh2uint64 (chArr + 8);
    uintArr[2] = fourCh2uint64 (chArr + 16);
    uintArr[3] = fourCh2uint64 (chArr + 24);

    std::cout << std::hex << uintArr[0] << " " << uintArr[1] << " ";
    std::cout << std::hex << uintArr[2] << " " << uintArr[3] << "\n";
                                                                                                                                                                                                                                                                                                                              
    return 0;
}

inline uint64_t fourCh2uint64 (const unsigned char charArr[4]) {
    return  uint64_t(charArr[0]) << 56 | uint64_t (charArr[1]) << 48 |
            uint64_t(charArr[2]) << 40 | uint64_t (charArr[3]) << 32 |
            uint64_t(charArr[4]) << 24 | uint64_t (charArr[5]) << 16 |
            uint64_t(charArr[6]) << 8  | uint64_t (charArr[7]);
}

和输出:

1a2a3a4a5a6a7a8a 1b2b3b4b5b6b7b8b 1c2c3c4c5c6c7c8c 1d2d3d4d5d6d7d8d

编辑: 为了避免 UB 转移更新我的功能

【讨论】:

  • 好的,谢谢。这接近我正在寻找的东西。它引导我走向正确的方向。我想我只需要颠倒 uintArr 的顺序,就可以在第四位获得 1a2a3a....
  • 编辑:是的,只是从 uintArr 3 2 1 0 更改了顺序,做到了。输出是:1d2d3d4d5d6d7d8d 1c2c3c4c5c6c7c8c 1b2b3b4b5b6b7b8b 1a2a3a4a5a6a7a8a 非常感谢
猜你喜欢
  • 2011-06-08
  • 1970-01-01
  • 2013-06-06
  • 2016-03-10
  • 2016-04-07
  • 2011-11-09
  • 2010-12-19
  • 1970-01-01
  • 2014-03-02
相关资源
最近更新 更多