【问题标题】:How to sum/XOR binary strings in C++?如何在 C++ 中求和/异或二进制字符串?
【发布时间】:2013-11-07 06:55:57
【问题描述】:

我想计算我的数据的校验和。将字符串转换为二进制后,我现在需要对所有 8 位字符串(对它们进行异或)求和,这样,如果异或在求和结束时产生溢出位(进位位),则应将该位添加到最后和,现在得到的值是最终值(8位校验和)。

然后我想取 8 位 FINAL 值的 1s 补码,这个新值将是我可以提前使用的实际校验和。我不知道如何处理这些二进制字符串中的每一个并将它们放在首位:(

#include <string>
#include <bitset>
#include <iostream>
using namespace std;
int main()
{
    string myString = "Hello World";
    for (std::size_t i = 0; i < myString.size(); ++i)
{
       cout << bitset<8>(myString.c_str()[i]) << endl;
}


//the indentations might have shaken a bit in copting the code here. 

}

【问题讨论】:

  • 异或不能溢出。你确定你知道 XOR 是什么以及它与求和有何不同吗?
  • 这听起来像是对 CRC 的部分描述,但如前所述,它开始没有意义。
  • 是的,它是部分的,因为我不想要 CRC 检查只是一个简单的校验和..一旦我得到输出显示的所有 8 位集的总和然后 1s 补充它,它就会完成。我想要一个二进制求和(这里的 1 + 1 = 1 0 ... 1 0 中的 1 是进位位,直到它到达 MSB,一旦它到达,它就变成一个溢出位(iv 称为溢出位)并且它得到添加到总和(不包括最后一个进位/溢出位的总和值)\以获得最终总和值)。

标签: c++ binary


【解决方案1】:

如果我很好理解问题,你可以编写这样的函数:

unsigned char checkSum(const string &str) {
    unsigned char answer = 0;
    for (size_t i = 0; i < myString.size(); ++i)
    {   // XOR each byte of the string and stores the result in answer.
        answer ^= str[i];
    }

    return answer;
}

用法:

unsigned char my_checksum = checkSum("Hello World");

请注意,如果您对 unsigned char(0 到 255)进行异或运算,您将始终得到介于 0 和 255 之间的结果。函数将作为输入参数传递的字符串的每个字节一起异或并返回结果。该算法也称为 LRC(纵向冗余校验)。

希望这是你想要的。

【讨论】:

  • 你为什么将 1 相加作为回报 ((answer ^ 0xFF) + 1) & 0xFF ?
  • 谢谢! :) 如果我想对 16 位(一对字节)做同样的事情,我应该如何编辑上面的代码?我应该使用 bitset 还是什么?其次,lRC 是否将所有 8 位流的“集合”相加?使用编辑后的版本,我有一种感觉,它将整个流彼此相加。或者我可能还不清楚。
  • 对于 16 位,称为 16 位 crc-ccitt。我建议你阅读this answer。有关于 CRC 实施的有用链接。
猜你喜欢
  • 2017-01-16
  • 2016-11-07
  • 1970-01-01
  • 2023-01-18
  • 2015-04-19
  • 2012-01-22
  • 2016-02-29
  • 2012-09-25
  • 1970-01-01
相关资源
最近更新 更多