【发布时间】:2019-06-21 05:27:41
【问题描述】:
在 C++ 中 我有一个有符号长长数组(63 位数字),可变长度数组。
std::array<long long, n> encodedString
这个数组实际上保存了一个 UTF-8 编码的字符串。这意味着如果你连接数组中每个元素的二进制文件,结果将是一个 UTF-8 编码的文本。
例如数组:
(621878499550 , 2339461068677718049)
如果你将那些有符号的 long long 翻译成 63 位二进制,它会给出:
621878499550 = 000000000000000000000001001000011001010110110001101100011011110
2339461068677718049 = 010000001110111011011110111001001101100011001000010000000100001
如果您将这些二进制文件连接到: 000000000000000000000000100100001100101011011000110110001101111001000000111011101101111011100100110110001100100001000000100010001
这是“Hello world!”的 UTF8 编码
所以问题是用“Hello world!”获取字符串的最简单方法是什么?从数组开始 (621878499550 , 2339461068677718049)
我目前的最佳解决方案是以二进制模式 (fwrite) 将数组写入文件,然后以文本模式将文件读取到字符串。
【问题讨论】:
-
请注意,
signed long long仍然是 64 位(至少)。 -
将数组写入字符串流而不是文件。然后你有相同的操作,但完全在内存中,而不是使用外部文件。
-
至于您的问题,您需要将数据放入一个字节数组(即基本上是
char的数组)。然后跳过前导零字节。然后您可以将剩余的数据复制到std::string。使用中间char缓冲区确实是唯一不受the strict aliasing rule 困扰的方法。 -
是的,你是对的,它仍然是 64 位,所以我需要去掉符号位。
-
您的样本数组的两个元素具有相同的值。这转化为
' world ! world !'。