如何在 golang 中使用 hexstrings 和位移位

how to work with hexstrings and bit shifting in golang

我有一个由 arduino 传感器构建的十六进制字符串 "5FEE012503591FC70CC8"

此值包含一个数组,其中特定数据位于十六进制字符串的特定位置。使用 javascript 我可以将 hexstring 转换为缓冲区,然后应用位移操作来提取数据,例如像这样的电池状态

  const bytes = new Buffer.from("5FEE012503591FC70CC8", "hex");
  const battery = (bytes[8] << 8) | bytes[9];
  console.log(battery)

我的尝试有效,但我觉得它不像我上面显示的 js 方式那样最佳

package main

import (
    "fmt"
    "strconv"
)

func main() {
    hex := "5FEE012503591FC70CC8"
    bat, err := strconv.ParseInt(hex[16:20],16,64)
    if err != nil {
        panic(err)
    }
    fmt.Println("Battry: ",bat)
}

如果有人能告诉我如何使用缓冲区或等效于 js 解决方案但在进行中,我将不胜感激。仅供参考,电池信息在十六进制字符串的最后 4 个字符中

将十六进制数字字符串转换为字节切片的标准方法是使用 hex.DecodeString:

import "encoding/hex"

bs, err := hex.DecodeString("5FEE012503591FC70CC8")

您可以将最后两个字节转换为 uint16(无符号,因为电池电量可能不是负数),其方式与 Javascript:

相同
bat := uint16(bs[8])<< 8 | uint16(bs[9])

https://play.golang.org/p/eeCeofCathF

或者您可以使用 encoding/binary 包:

bat := binary.BigEndian.Uint16(bs[8:])

https://play.golang.org/p/FVvaofgM8W-