我正在使用这个CRC包来计算消息的XMODEM CCITT crc值。 crc 值为 uint64s,作者演示了
使用// crc1 is a uint64
fmt.Printf("CRC is 0x%04Xn", crc1) // prints "CRC is 0x2C89"
如何在不使其成为字符串并拆分的情况下将其转换为两个字节?%04X
是每字节 16 个基数两个字符,如果我正确理解 fmt 文档。
我只知道几件事:(1(,我正在为其编写适配器的硬件需要两个字节的CRC值。(2(,这个CRC包的作者表明uint64可以显示为0xFFFF,即两个字节。(3(,在线CRC计算器将这些值显示为两个字节,例如 https://www.lammertbies.nl/comm/info/crc-calculation.html。其余的对我来说是新的...
我刚刚发布了CRC软件包自述文件中的片段。由于 uint64 通常是 8 个字节,我真的不明白如何在不丢失数据的情况下做到这一点。
在线CRC计算和免费库
https://www.lammertbies.nl/comm/info/crc-calculation.html
LibCRC – C 语言的开源 CRC 库
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
目前尚不清楚您是尝试获取 int64 值的两个最低字节,还是要获取两个字符串,每个字符串有两个十六进制数字。无论如何:
b1:=byte(crc1>>8)
b2:=byte(crc1&0xFF)
str1:=fmt.Sprintf("%02X",b1)
str2:=fmt.Sprintf("%02X",b2)
或
crc:=uint16(crc1)
上面,crc 是 2 个字节。