Более здесь , есть реализация CCITT-CRC16. Для тех, кто избегает ссылок, это написано на C так:
unsigned short crc16(data_p, length)
char *data_p;
unsigned short length;
{
unsigned char i;
unsigned int data;
unsigned int crc;
crc = 0xffff;
if (length == 0)
return (~crc);
do {
for (i = 0 data = (unsigned int)0xff & *data_p++;
i < 8;
i++, data >>= 1) {
if ((crc & 0x0001) ^ (data & 0x0001))
crc = (crc >> 1) ^ POLY;
else
crc >>= 1;
}
} while (--length);
crc = ~crc;
data = crc;
crc = (crc << 8) | (data >> 8 & 0xFF);
return (crc);
}
Но я не совсем понимаю, как это применимо к моему делу. Я перевожу с частного / неизвестного языка, который имеет встроенный CCITT CRC16. Он имеет функцию класса CRC следующим образом:
CRCname.put (int byte):
байт - целочисленное значение, используемое для обновления текущего CRC. Только
используются младшие 8 битов параметра.
Мне нужны два поля в реализации CCITT-CRC16, которые я нашел, data_p
и length
, поэтому мой вопрос ... что подразумевается под целочисленным значением, используемым для обновления crc? Внутри кода, который я перевожу, программа довольно часто выполняет crc.put(someChar)
, затем изменяет someChar
перед повторным вызовом crc.put(someChar)
и делает это несколько раз. Допустим, я сохранил все эти someChars
, один за другим, в массив с именем someChars
.
Будет ли CRC, полученный из всех этих символов, вызываться через crc16(someChars, sizeof(someChars)/sizeOf(someChars[0]))
..?
Кроме того, должен ли я использовать тип uint8_t
для моего массива?
У меня нет примеров, поэтому я прошу здесь убедиться, что это на 100% правильно.