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

Define a []byte without hex.DecodeString

我正在使用 HID 驱动程序,该驱动程序读取 []byte 缓冲区中的几个不同报告之一。当我使用 hex.EncodeToString(buffer) 时,它会 return 一个看起来像 000001000200 等的字符串。我想使用开关检查,针对来自 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

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

编辑

关于所提供解决方案的说明,EncodeToString 十六进制 00000100 不是 四个 字节而是 两个:

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

所以我可以使用,以获得 0100 或 0200,如建议的那样:

var LEFT []byte{1,0}
// or 
var LEFT []byte("\x01\x00")

使用以下内容:

var (
    left = []byte{0, 0}
    right = []byte{1, 0}
    // ... and so on
)

如果你想写成十六进制:

var (
    left = []byte{0x00, 0x00}
    right = []byte{0x01, 0x00}
    // ... and so on
)

您还可以将字符串转换为 []byte:

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"
}

您似乎正在使用以小端格式编码的 2 字节数字。如果是这样,您可以 decode the bytes to an integer:

const (
    left = 0
    right = 1
)

switch binary.LittleEndian.Uint16(byteSlice) {
case left:
    fmt.Println("left")
case right:
    fmt.Println("right")
}

定义 []byte 最简单,建议按照 Mellow Marmot 的建议使用 Composite literal。请注意,复合文字还有一个优点,您可以在文字中使用可选索引,并且 "missing" 索引的值将是元素类型的零值(0 在 [=16= 的情况下) ]).而且如果你需要一个 []byte 全是零,你不需要列出元素,你可以 make 一个 "empty" 切片。

例如,您也可以这样创建切片:

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 值可以直接转换为 []byte 从而得到 string 的 UTF-8 编码字节的字节序列(这是 Go 存储的方式内存中的字符串)。

因此,如果您可以提供具有您需要的 UTF-8 编码字节序列的 string 文字,您可以简单地 convert it to []byte. And since interpreted string literals 可能包含转义序列,这比您想象的要容易:

The three-digit octal (\nnn) and two-digit hexadecimal (\xnn) escapes represent individual bytes of the resulting string...

因此,您还可以像这样指定在 string 中编码的字节值:

// With octal escapes
var (
    left  = []byte("[=12=]0[=12=]0")
    right = []byte("[=12=]1[=12=]0")
)

// With hexa escapes
var (
    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]

查看相关问题:

您不能在 switch 中使用 []byte,因为切片不可比较,而字符串可以。 所以接缝只是

const LEFT = `0000`