CRC - uint64 до двух байтов? - PullRequest
       97

CRC - uint64 до двух байтов?

0 голосов
/ 04 октября 2019

Я использую этот пакет CRC для вычисления значений CRM XMODEM CCITT для сообщений. Значения crc - это uint64s, и автор демонстрирует печать шестнадцатеричное значение кода CRC в виде двух байтов, используя

// crc1 is a uint64
fmt.Printf("CRC is 0x%04X\n", crc1) // prints "CRC is 0x2C89"

Как преобразовать это в два байта, не превращая его в строкуи разделить это? %04X - это основа-16 двух символов на байт, если я правильно понимаю fmt docs.

Я знаю только несколько вещей: (1) аппаратное обеспечение, для которого я пишу адаптер, ожидает два байта длязначение CRC. (2), что автор этого пакета CRC показывает, что uint64 может отображаться как 0xFFFF, что составляет два байта. (3), что онлайн-калькуляторы CRC показывают эти значения в виде двух байтов, например https://www.lammertbies.nl/comm/info/crc-calculation.html. Остальное для меня ново ...

Я только что опубликовал фрагмент из файла readme пакета CRC. Поскольку размер uint64 обычно составляет 8 байт, я действительно не понимаю, как это можно сделать без потери данных.

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Он-лайн расчет CRC и бесплатная библиотека

https://www.lammertbies.nl/comm/info/crc-calculation.html

LibCRC - библиотека CRC с открытым исходным кодом в C

https://www.libcrc.org/api-reference/

https://github.com/lammertb/libcrc/blob/master/src/crc16.c

/*
 * uint16_t crc_16( const unsigned char *input_str, size_t num_bytes );
 *
 * The function crc_16() calculates the 16 bits CRC16 in one pass for a byte
 * string of which the beginning has been passed to the function. The number of
 * bytes to check is also a parameter. The number of the bytes in the string is
 * limited by the constant SIZE_MAX.
 */

uint16_t crc_16( const unsigned char *input_str, size_t num_bytes ) {

// code Copyright (c) 1999-2016 Lammert Bies

}  /* crc_16 */

Тип C uint16_t - тип Go uint16.

uint16 = uint16(uint64)

crc16 = 0xFFBB = uint16(0x000000000000000FFBB)

crc16[0], crc16[1] = byte(uint64>>8), byte(uint64)

crc16[0], crc16[1] = 0xFF, 0xBB = byte(0x000000000000000FFBB>>8), byte(0x000000000000000FFBB)


Ссылки:

CRC-16-CCITT: https://en.wikipedia.org/wiki/Cyclic_redundancy_check

Протокол XModem с CRC: http://web.mit.edu/6.115/www/amulet/xmodem.htm

0 голосов
/ 04 октября 2019

Не ясно, пытаетесь ли вы получить два младших байта значения int64 или хотите получить две строки с двумя шестнадцатеричными цифрами в каждой. В любом случае:

b1:=byte(crc1>>8)
b2:=byte(crc1&0xFF)

str1:=fmt.Sprintf("%02X",b1)
str2:=fmt.Sprintf("%02X",b2)

Или

crc:=uint16(crc1)

Выше, crc равен 2 байта.

...