最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Node.js来自hex的缓冲区和Golang中的readUInt16BE

运维笔记admin12浏览0评论

Node.js来自hex的缓冲区和Golang中的readUInt16BE

Node.js来自hex的缓冲区和Golang中的readUInt16BE

我在nodejs中有这样的代码:

// Create Buffer from hex representation
b = new Buffer('002400050200000000320000000003847209cd4450ff94ad8c0000000002c581000001d3', 'hex')

// Read with offset 0
b.readUInt16BE(0) // -> Out: 36

它读取一个字符串,它是数据的十六进制表示。当读取前两个字节readUInt16BE时,获得int(36)。这是预期的行为。

我需要使用Go复制此行为,但我遇到了一些麻烦。

1)如何从十六进制格式的字符串创建缓冲区? 2)如何实现readUInt16BE函数以便在读取前两个字节时获得(36)?

我可以用00 24创建一个缓冲区,但我需要使用任何字符串。

// Creates buffer [00 24]
v := make([]byte, 0, 2)
v = append(v, 0)
v = append(v, 24)
fmt.Println(v) // -> out: [0 24]

最后,我对函数binary.BigEndian.Uint16有点困惑,它返回24而不是36。

x := binary.BigEndian.Uint16(v)
fmt.Println(x) // -> out: 24

你能帮我理解一下吗?

回答如下:

当您应该附加十六进制值0x24时,您将十进制值24附加到缓冲区:

v := make([]byte, 0, 2)
v = append(v, 0)
v = append(v, 0x24)
fmt.Println(v)

x := binary.BigEndian.Uint16(v)
fmt.Println(x)

将原始Node.js代码转换为Go将如下所示:

import (
    "encoding/binary"
    "encoding/hex"
)

b, err := hex.DecodeString(`002400050200000000320000000003847209cd4450ff94ad8c0000000002c581000001d3`)
if err != nil {
    // TODO: handle error
}
_ = binary.BigEndian.Uint16(b[:2])
发布评论

评论列表(0)

  1. 暂无评论