定义一个没有 hex.DecodeString 的 []byte
Define a []byte without hex.DecodeString
我正在使用 HID 驱动程序,该驱动程序读取 []byte
缓冲区中的几个不同报告之一。当我使用 hex.EncodeToString(buffer)
时,它会 return 一个看起来像 0000
或 0100
或 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
另一种方法是我在 main() 函数中调用 hex.DecodeString("0000")
。
编辑
关于所提供解决方案的说明,EncodeToString
十六进制 0000
或 0100
不是 四个 字节而是 两个:
"\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`
我正在使用 HID 驱动程序,该驱动程序读取 []byte
缓冲区中的几个不同报告之一。当我使用 hex.EncodeToString(buffer)
时,它会 return 一个看起来像 0000
或 0100
或 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
另一种方法是我在 main() 函数中调用 hex.DecodeString("0000")
。
编辑
关于所提供解决方案的说明,EncodeToString
十六进制 0000
或 0100
不是 四个 字节而是 两个:
"\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`