我已将一些数据序列化为一个ostream,通过设备文件发送,以二进制格式发送。
打印ostream的内容时,我得到这样的输出。
现在我需要使用某种算法计算校验和:
由于我使用的是文件流,因此我有字符串格式的二进制数据:
例如:
... 46774101101140410MyMakeMyModel10000
我想使用算法计算校验和..
就像
校验和是通过2对所有16位字的补充加法计算的
如果是奇数个八位字节,则最后的八位字节假定为在MSB中填充16位0。
我正在研究解决方案请建议一个简单的方法输入是字符串或字符*
由于
答案 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的代码可能会显示方法。