Я пытаюсь создать байтовый массив, который имеет определенный результат BCC (Block Check Character) (= 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.
В настоящее время я использую метод проб и ошибок, но я почти уверен, что есть лучший способ сделать это — я просто не нашел тот, который работает. Я ознакомился с инструментом, который копирует метод BCC, который используется выше (в C #), и который не согласуется с результатами, которые я получаю (вздыхает).
Вы можете установить контрольную сумму на ноль, заменив любой отдельный символ на символ xor ed текущей контрольной суммой.
Например, измените test2 на test #
0x32(#) = 0x23(2)^0x11
Возможно, вам придется позаботиться о том, чтобы избежать определенных специальных символов (похоже, 0x03 в некоторой степени значим, и часто следует также избегать 0x00 в случае, если строки используют нулевое завершение). Например, если вы хотите превратить символ в 0x03, вы можете вместо этого добавить два символа, xor которых равен 0x03, например «a» и «b».
Других решений пока нет …