为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕森王 2022-03-07 22:46:22
我正在使用 HID 驱动程序,该驱动程序读取[]byte几个不同报告之一的缓冲区。当我使用hex.EncodeToString(buffer)时,它会返回一个看起来像0000or0100或0200等的字符串。我想使用开关检查来自 HID 设备的输入,所以我想在 之外预定义这些可能性,main()我应该如何继续?我尝试了这些可能性:var LEFT []byte = []byte('0000')// orvar LEFT []byte = `0000`// or var LEFT []byte = '0000'// orvar 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")
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

使用以下内容:


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

}


查看完整回答
反对 回复 2022-03-07
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

正如 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 escapes

var (

    left  = []byte("\000\000")

    right = []byte("\001\000")

)


// 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]


查看完整回答
反对 回复 2022-03-07
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

你不能使用 []byte inswitch因为切片是不可比较的,字符串是。所以接缝只是

const LEFT = `0000`


查看完整回答
反对 回复 2022-03-07
  • 3 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信