首页 > 解决方案 > 将 unsigned int 中的原始字节转换为字符串的最简单和最有效的方法

问题描述

在 C++ 中,将 unsigned int 中的原始字节转换为字符串(例如通过 ASCII 编码读取)的最简单和最有效的方法是什么?

一个 uint64_t 包含 8 个字节,我想将这些字节解释为 (char*),附加终止标志 ('\0'),然后转换为字符串。这样,我可以将“原始”数据存储在尽可能短的字符串中。

例如,假设我们有包含位 0100 0001 0100 0001 的 uint16_t(我相信这里每个 8 位序列都是“A”)。我想把这些放在一个字符串 str 中,这样 (str == "AA") 是真的。

我的意思是要如何在不压缩的情况下以最节省空间的方式将一些数据(例如 int)存储在字符串中。

太感谢了。

标签: c++stringdata-manipulation

解决方案


我将在下面留下我原来的答案,但最有效的解决方案似乎也是最简单的(由下面的@Remy Lebeau 提出):

std::string string(reinterpret_cast<const char *>(&value), sizeof(value));

如果您使用的是 C++17,您还可以使用 std::string_view 并完全避免复制和堆分配:

std::string_view string(reinterpret_cast<const char *>(&value), sizeof(value));

当然,所有这些都围绕着 C 字符串表示的非常简单的性质。我们在这里所做的只是告诉语言将整数的地址解释为 C 字符串。如果您真的关心空间和执行效率并且不能使用 C++17,那么也许只使用 C 字符串。

原始解决方案:

这个解决方案仍然存在字节序问题,但鉴于所有主要架构都是小字节序,这应该只在网络环境中考虑。std::string 可以接受字节上的迭代器。它会自动添加空终止符。

uint64_t value = 100;
const uint8_t *const bytes = reinterpret_cast<const uint8_t *>(&value);
std::string string(bytes, bytes + sizeof(uint64_t));

推荐阅读