将std :: string转换为uint16_t *

时间:2014-10-25 11:59:30

标签: c++

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

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

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

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

例如:

... 46774101101140410MyMakeMyModel10000

我想使用算法计算校验和..

就像

校验和是通过2对所有16位字的补充加法计算的

如果是奇数个八位字节,则最后的八位字节假定为在MSB中填充16位0。

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

由于

2 个答案:

答案 0 :(得分:4)

您的代码通过违反严格别名规则来引发未定义的行为。如果您无法确定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

答案 1 :(得分:0)

似乎你在这里的主要斗争是将std::string转换为整数。 您可以使用std::string::substr将字符串分解为所需大小的块,并将每个块转换为整数。

this question的代码可能会显示方法。