定义一个没有 hex.DecodeString 的 []byte

我正在使用 HID 驱动程序,该驱动程序读取[]byte几个不同报告之一的缓冲区。当我使用hex.EncodeToString(buffer)时,它会返回一个看起来像0000or0100或0200等的字符串。我想使用开关检查来自 HID 设备的输入,所以我想在 之外预定义这些可能性,main()我应该如何继续?


我尝试了这些可能性:


var LEFT []byte = []byte('0000')

// or

var LEFT []byte = `0000`

// or 

var LEFT []byte = '0000'

// or

var LEFT []byte = '\x00\x00' // from the %q Printf verb

另一种方法是我hex.DecodeString("0000")在 main() 函数内部调用。


编辑


关于所提供解决方案的注释,EncodeToString十六进制0000或0100不是四个字节,而是两个:


"\x01"== "01"=='1'


所以我可以按照建议使用,以获得 0100 或 0200:


var LEFT []byte{1,0}

// or 

var LEFT []byte("\x01\x00")


慕森王
浏览 128回答 3
3回答

潇潇雨雨

使用以下内容:var (    left = []byte{0, 0}    right = []byte{1, 0}    // ... and so on)如果你想用十六进制写:var (    left = []byte{0x00, 0x00}    right = []byte{0x01, 0x00}    // ... and so on)您还可以将字符串转换为 [] 字节:var (    left = []byte("\x00\x00")    right = []byte("\x01\x00"))在 switch 语句中使用这些变量,如下所示:switch {case bytes.Equal(v, left):    fmt.Println("left")case bytes.Equal(v, right):     fmt.Println("right"}看起来您正在使用以 little-endian 格式编码的 2 字节数字。如果是这样,您可以将字节解码为整数:const (    left = 0    right = 1)switch binary.LittleEndian.Uint16(byteSlice) {case left:    fmt.Println("left")case right:    fmt.Println("right")}

慕尼黑的夜晚无繁华

正如 Mellow Marmot 建议的那样,定义 a[]byte是最简单的,建议使用Composite 文字。请注意,复合文字还具有您可以在文字中使用可选索引的优点,并且“缺失”索引的值将是元素类型的零值(0在 的情况下byte)。而且如果你需要一个[]byte完整的零,你不需要列出元素,你可以只是make一个“空”切片。因此,例如,您也可以像这样创建切片:var (    left  = make([]byte, 2) // will be [0, 0]    right = []byte{1: 1}    // will be [0, 1])func main() {    fmt.Println(left, right)}输出(在Go Playground上试试):[0 0] [0 1]也知道string值可以直接转换成[]byteUTF-8 编码字节的字节序列string(这就是 Go 在内存中存储字符串的方式)。因此,如果您可以提供string具有所需 UTF-8 编码字节序列的文字,您只需将其转换为[]byte. 而且由于解释的字符串文字可能包含转义序列,它比你想象的要容易:三位八进制 ( \nnn ) 和两位十六进制 ( \xnn ) 转义表示生成字符串的各个字节...因此,您还可以指定以string如下方式编码的字节值:// With octal escapesvar (    left  = []byte("\000\000")    right = []byte("\001\000"))// With hexa escapesvar (    left2  = []byte("\x00\x00")    right2 = []byte("\x01\x00"))func main() {    fmt.Println(left, right)    fmt.Println(left2, right2)}输出(在Go Playground上试试):[0 0] [1 0][0 0] [1 0]

慕姐4208626

你不能使用 []byte inswitch因为切片是不可比较的,字符串是。所以接缝只是const LEFT = `0000`
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go