在Go中跨字节编码20位数字

在Go中跨字节编码20位数字,go,binary,Go,Binary,我有以下的布局,我正在努力实现围棋 目前,我可以解决如何从字节0编码/设置位6和7 // Element ID flag bytesToSend[0] |= (1 << 7) //N/S Flag bytesToSend[0] |= (1 << 6) //元素ID标志 bytesToSend[0]|=(1写入时,必须使用相反的移位方向。而且由于中的块数类型为int,因此必须将结果转换为字节: bytesToSend[0] |= byte(block_num_in &

我有以下的布局,我正在努力实现围棋

目前,我可以解决如何从字节0编码/设置位6和7

// Element ID flag
bytesToSend[0] |= (1 << 7)

//N/S Flag 
bytesToSend[0] |= (1 << 6)
//元素ID标志

bytesToSend[0]|=(1写入时,必须使用相反的移位方向。而且由于
中的
块数类型为
int
,因此必须将结果转换为
字节

bytesToSend[0] |= byte(block_num_in >> 16 & 0x0f)
bytesToSend[1] = byte(block_num_in >> 8 & 0xff)
bytesToSend[2] = byte(block_num_in)

还有,如果你要做很多涉及步进字节边界的功夫,请考虑使用(披露:我是作者)。.

如果你知道如何从字节中组装它,是什么导致将它拆分为字节的问题?这非常相似。谢谢@icza。我已经用我尝试过的方法更新了这个问题。非常感谢。我认为第二个2字节实际上不需要0xff,对吗?@Leeramstrong是的,你可以省去它,因为
int=>字节转换将保持最低的8位。这是一个很好的包!
block_num_in := 343348
bytesToSend[0] |= block_num_in << 16
block_num_in := 343348
bytesToSend[0] |= (byte(block_num_in) << 16) & 0x0f
bytesToSend[1] |= byte(block_num_in) << 8
bytesToSend[2] |= byte(block_num_in)
bytesToSend[0] |= byte(block_num_in >> 16 & 0x0f)
bytesToSend[1] = byte(block_num_in >> 8 & 0xff)
bytesToSend[2] = byte(block_num_in)