c# - 如何创建一个具有给定值 (0) 的 BCC( block 校验字符)的字节数组?

标签 c# c++ algorithm bit-manipulation error-detection

我正在尝试创建一个具有特定 BCC( block 校验字符)结果 (=0) 的字节数组。

数组的序言是:

32 02 31 1F 31 1E 32 1F T  E  S  T  :  
32 02 31 1F 31 1E 32 1F 54 45 53 54 3A 20

中间有一个可变文本消息(msg):

T  e  s  t  2
54 65 73 74 32

后跟:

1E 37 1F 33 03

我得到的这个字符串的 BCC 是:0x11

这是返回该值的算法 (C++):

unsigned char bcc=0;
int index = block.Find(0x03); //ETX
for (int i=0; i<= index;i++)
    bcc ^= block[i];
return bcc;

我正试图想出一种方法来找到将导致 BCC 为 0 的中间消息部分。

我目前正在尝试和错误,但我很确定有更好的方法来做到这一点 - 我只是没有想出一个可行的方法。我试用了一个工具,该工具复制了上面(在 C# 中)使用的 BCC 方法,但它与我得到的结果不一致(叹息)。

最佳答案

您可以通过将任何单个字符替换为与当前校验和进行异或运算的字符来将校验和设置为零。

比如把test2改成test#

0x32(#) = 0x23(2)^0x11

您可能需要注意避免使用某些特殊字符(看起来 0x03 在某些方面很重要,通常也应避免使用 0x00 以防字符串使用空终止)。例如,如果您想将一个字符变成 0x03,您可能更愿意添加两个 xor 为 0x03 的字符,例如 'a' 和 'b'

关于c# - 如何创建一个具有给定值 (0) 的 BCC( block 校验字符)的字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21340783/

相关文章:

c# - 将 DataTable 转换为 XML 文件,反之亦然

c++ - 是否有办法使用Booth算法捕获二进制乘法期间的上溢/下溢?

c++ - 我可以进一步减少这个小型 MSVC++ 项目的 "private bytes"内存使用吗?

python - 尝试在加载此文件时实现缓存

c# - 我不能在文本框中写小数

c# - 转换到泛型时忽略 T

C# 在不使用 System.IO.FileInfo 的情况下获取文件属性

c++ - C++中的多线程链表

algorithm - spoj : SCALES - Balancing the Stone?如何解决

algorithm - Photoshop 的高光或阴影改变背后的算法是什么?