Go CRC-uint64到两个字节?

Go CRC-uint64到两个字节?,go,type-conversion,byte,crc,uint64,Go,Type Conversion,Byte,Crc,Uint64,我使用CRC包计算消息的XMODEM CCITT CRC值。crc值为uint64s,作者演示了如何使用 // crc1 is a uint64 fmt.Printf("CRC is 0x%04X\n", crc1) // prints "CRC is 0x2C89" 如何将其转换为两个字节,而不使其成为字符串并拆分%04X是base-16,每个字节两个字符,如果我正确理解fmt文档的话 我只知道几件事:(1),我正在为其编写适配器的硬件需要两个字节的CRC值。(2) ,该CRC包的作者显示u

我使用CRC包计算消息的XMODEM CCITT CRC值。crc值为uint64s,作者演示了如何使用

// crc1 is a uint64
fmt.Printf("CRC is 0x%04X\n", crc1) // prints "CRC is 0x2C89"
如何将其转换为两个字节,而不使其成为字符串并拆分<代码>%04X是base-16,每个字节两个字符,如果我正确理解fmt文档的话

我只知道几件事:(1),我正在为其编写适配器的硬件需要两个字节的CRC值。(2) ,该CRC包的作者显示uint64可以显示为0xFFFF,即两个字节。(3) ,即在线CRC计算器将这些值显示为两个字节,例如。其余的对我来说是新的


我刚刚发布了CRC软件包自述中的一个片段。由于uint64通常为8字节,我真的不明白如何在不丢失数据的情况下实现这一点

不清楚是要获取int64值的两个最低字节,还是要获取两个字符串,每个字符串有两个十六进制数字。无论如何:

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

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

上面,crc是2字节

在线CRC计算与免费库

LibCRC–C语言中的开源CRC库


C型
uint16\u t
是Go型
uint16

uint16=uint16(uint64)

crc16=0xFFBB=uint16(0x000000000000000FFBB)

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

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


参考资料:

CRC-16-CCITT:


带有CRC的XModem协议:

如果您需要一个两字节的值,那么uint16(crc1)就是您所需要的。但是如果你要把它写到某个硬件上,你需要弄清楚这是big-endian还是little-endian。硬件需要一个little-endian的数据流,后跟big-endian CRC/如果/失去“范围”是唯一的机制,并且不是更聪明的方法,那么我可以
编码/binary.BigEndian.PutUvarInt
uint64…@BrandonDube-当CRC与数据流一起使用时,第一个字节是最重要的,最后一个字节是最不重要的。CRC首先附加到数据流最高有效字节,最后附加到最低有效字节。每个字节内的位可以被反射,这通常是在每个字节中的位(包括CRC字节中的位)首先被传输最低有效位的情况下进行的。这允许硬件在实时发送或接收数据流+CRC时一次编码/解码1位。如果CRC为2字节,则int64值的上6字节都是0。@bserdar的注释解释说uint64 CRC的上6字节为零(因此没有数据丢失的风险),他的回答解释了如何将uint64 CRC转换为两个字节。请注意,snksoft/crc/crc.go包含一个CRC16()函数,该函数显示如何在uint64和uint16之间进行类型转换。
crc:=uint16(crc1)
/*
 * 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 */