将std::string转换为uint16_t*

Convert std::string to uint16_t*

本文关键字:uint16 转换 std string      更新时间:2023-10-16

我已经将一些数据序列化到一个ostream中,以便通过设备文件发送。,二进制格式。

当打印ostream的内容时,我得到了这样的输出,这很好。

现在我需要使用某种算法来计算校验和:

由于我使用的是文件流,所以我有字符串格式的二进制数据:

例如:

46774101101140410MyMakeMyModel10000…

我想用算法计算校验和。。

就像

校验和是通过所有16位字的2的互补相加来计算的

在奇数个八位字节的情况下,最后的八位字节假定为MSB中填充的16位0。

我正在研究解决方案,请建议一个防傻的方法输入是字符串或字符*

感谢

您的代码通过打破严格的别名规则来引发未定义的行为。如果您不能确定data所指向的数据是否与uint16_t正确对齐,那么这甚至可能成为一个实际问题(正如Kerrek在评论中提到的那样)。

对于string,您必须将内容复制到uint16_t-数组中,然后从那里开始工作
它可能看起来像这样:

std::string str;
// Put some data into str
std::vector<std::uint16_t> array((str.size() + sizeof(std::uint16_t) - 1) / sizeof std::uint16_t);
std::copy_n(str.data(), str.size(), reinterpret_cast<char*>(&array[0]));
// Work with array

您在这里的主要困难似乎是将std::string转换为整数。您可以使用std::string::substr将字符串分成任意大小的块,并将每个块转换为一个整数。

这个问题中的代码可能显示了这种方法。