如何将 uint32_t 数字转换为 char[8]?

Posted

技术标签:

【中文标题】如何将 uint32_t 数字转换为 char[8]?【英文标题】:How to convert uint32_t number to char[8]? 【发布时间】:2020-11-10 20:22:05 【问题描述】:

假设我们有一个string s = "453acd0f"。现在我想做这样的事情:

uint32_t res = 0;
for (size_t i = 0; i < 8; ++i) 
    res |= ConvertCharToHexNumber(s[8 - i - 1]) << (i * 4);

但是如果我有一个从二进制文件中读取的uint32_t var 变量,我应该怎么做呢?

【问题讨论】:

sizeof(uint32_t) 通常是4。你确定要char[8]吗?您的标题和代码似乎不匹配。该代码似乎将char[] 转换为uint32_t 这能回答你的问题吗? Converting an int into a 4 byte char array (C) @TedLyngmo 十六进制数字是半字节。 @eerorika 是的,但 OP 也谈到了二进制文件。我不确定转换应该采用哪种方式。 :) 查找标准(C++11 及更高版本)函数std::stoul() - 在标准头文件&lt;string&gt; 中指定。 【参考方案1】:

将4字节uint32_t转换为char[8]的最简单方法:

    uint32_t var = 100;
    char res[8];
    res[0] = (var >> 28) & 0XF;
    res[1] = (var >> 24) & 0XF;
    res[2] = (var >> 20) & 0XF;
    res[3] = (var >> 16) & 0XF;
    res[4] = (var >> 12) & 0XF;
    res[5] = (var >> 8)  & 0XF;
    res[6] = (var >> 4)  & 0XF;
    res[7] = (var >> 0)  & 0XF;

您可以将其简化为循环:

    int shiftby = 32;
    for (int i = 0; i < 8; i++) 
        res[i] = (var >> (shiftby -= 4)) & 0xF;
    

【讨论】:

我虽然期待文本结果!这不会产生文本格式。【参考方案2】:

我相信 iomanip 和流操作可能会对您有所帮助。

#include <sstream>
#include <iomanip>


std::string s="453acd0f";
std::stringstream ss(s);
uint32_t res;
ss >> std::setbase(16) >> res;    // hex. string to int. res==1161481487

ss.str(string());
ss.clear();
s.clear();

ss << std::setbase(16) <<res;    // dec. int to hex. string.
s = ss.str();    // s==453acd0f

【讨论】:

【参考方案3】:

如果从二进制文件中读取的 uint32 实际上是 uint32,那么除了被解释为无符号 32 位整数之外,它没有任何格式。在这种情况下,您读取数字,然后将其转换为十六进制表示。

例如:

std::ifstream ifs("file.dat", ios_base::binary);

char buffer[64];
uint32_t n;

ifs.read(buffer, sizeof(uint32_t));
memcpy(&n, buffer, sizeof(uint32_t));

std::cout << std::hex << n << endl;

在这里给猫剥皮的方法不止一种。你可以直接阅读:

uint32_t n = 0xABC123;

// Get string representation of n
std::stringstream ss;
ss << std::hex << n;

// Pull out string, copy ptr to char array if you like
std::string s = ss.str();

// s.c_str() for example, for the C style string
std::cout << s << std::endl;

我希望能回答这个问题,如果它将 uint32_t 读取为 4 个字节,然后显示或保存 char* 字符串十六进制表示。

【讨论】:

以上是关于如何将 uint32_t 数字转换为 char[8]?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 32 字符(0/1)的序列转换为 32 位(uint32_t)?

uint8_t uint32_t 类型强制转换出错 以及 unsigned char 类型和 unsigned int 类型相互转化

如何将字符串转换为 uint32_t [重复]

如何在 Neon 中将 uint32x4_t 转换为 uint8x16_t?

如何将字符数组转换为 uint8_t

如何在 ARM NEON 中将 uint8x8_t 加载到 float32x4 中?