go - 如何在 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 个字符中
解决方案
将十六进制数字字符串转换为字节切片的标准方法是使用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:])
推荐阅读
- python - 我很难理解“open()”函数在 Python 中的工作原理
- r - 使用 R 在 X 轴上创建具有 2 个变量的箱线图
- c# - Lambda 不能进行 Int16 比较?
- windows-10 - 如何在 Windows 10 中预览无扩展名文件
- java - java.awt.Desktop.getDesktop().browse(uri) 在 ubuntu 上吐出一些调试信息。我怎样才能禁用它?
- applescript - 在预览中执行自动另存为
- java - 如何使用观察者模式刷新 SpringSecurityConfig?
- angular - 如何在服务中包含私钥而不将其放在前端代码中?
- c# - 如何为封闭泛型的闭包类型的完整层次结构解析所有服务类型
- jquery - 设置下拉列表的文本值不断重置