首页 > 解决方案 > 如何在 golang 中使用十六进制字符串和位移

问题描述

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

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

  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 个字符中

标签: gohexbufferbit-shift

解决方案


将十六进制数字字符串转换为字节切片的标准方法是使用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-


推荐阅读