0

0

Go 语言中 readUInt16BE 的等效实现与字节序处理

花韻仙語

花韻仙語

发布时间:2025-10-30 14:47:21

|

911人浏览过

|

来源于php中文网

原创

Go 语言中 readUInt16BE 的等效实现与字节序处理

本文详细介绍了如何在 go 语言中实现 node.js `buffer.readuint16be` 的功能。通过 `encoding/binary` 包,我们可以高效地处理字节序,实现从字节切片中读取和写入无符号16位整数。文章将演示如何使用 `binary.bigendian.uint16` 和 `binary.bigendian.putuint16` 等函数来精确控制大端序和小端序的数据操作,并提供了完整的示例代码和注意事项,帮助开发者在 go 项目中进行二进制数据解析和构建。

Go 语言中的字节序处理

在跨平台或与不同系统进行二进制数据通信时,字节序(Endianness)是一个至关重要的概念。它定义了多字节数据(如 uint16, uint32, float64 等)在内存或传输流中字节的存储顺序。主要有两种字节序:

  • 大端序 (Big-Endian):高位字节存储在低内存地址,低位字节存储在高内存地址。这与我们书写数字的习惯(从左到右,高位在前)一致。例如,十六进制数 0x1234 在大端序中存储为 [0x12, 0x34]。Node.js 的 readUInt16BE 函数正是处理大端序的无符号16位整数。
  • 小端序 (Little-Endian):低位字节存储在低内存地址,高位字节存储在高内存地址。例如,十六进制数 0x1234 在小端序中存储为 [0x34, 0x12]。

Go 语言通过标准库 encoding/binary 包提供了强大的字节序处理能力,使得开发者能够轻松地在字节切片和各种数值类型之间进行转换,并指定所需的字节序。

实现 readUInt16BE 功能

Node.js 的 Buffer.readUInt16BE(offset, [noAssert]) 函数用于从缓冲区中指定偏移量处读取一个大端序的无符号16位整数。在 Go 语言中,我们可以使用 encoding/binary 包中的 binary.BigEndian.Uint16() 函数来实现相同的效果。此外,encoding/binary 包也提供了写入相应类型数据的函数,例如 binary.BigEndian.PutUint16()。

Typeface
Typeface

AI创意内容创作助手

下载

以下是一个完整的 Go 语言示例,演示了如何读取和写入大端序及小端序的 uint16 数据:

package main

import (
    "encoding/binary"
    "fmt"
)

func main() {
    // 创建一个足够大的字节缓冲区,用于存储和操作二进制数据
    buf := make([]byte, 1024)

    // --- 写入操作示例 ---

    // 示例1: 写入一个大端序的 uint16 (值 320) 到缓冲区的偏移量 127 处
    // 数值 320 的十六进制表示为 0x0140。
    // 大端序意味着高位字节在前:[0x01, 0x40]。
    offsetBE := 127
    valueBE := uint16(320)
    binary.BigEndian.PutUint16(buf[offsetBE:], valueBE)
    fmt.Printf("写入大端序值 %d 到 buf[%d:],字节表示: %v\n", valueBE, offsetBE, buf[offsetBE:offsetBE+2])

    // 示例2: 写入一个小端序的 uint16 (值 420) 到缓冲区的偏移量 255 处
    // 数值 420 的十六进制表示为 0x01A4。
    // 小端序意味着低位字节在前:[0xA4, 0x01]。
    offsetLE := 255
    valueLE := uint16(420)
    binary.LittleEndian.PutUint16(buf[offsetLE:], valueLE)
    fmt.Printf("写入小端序值 %d 到 buf[%d:],字节表示: %v\n", valueLE, offsetLE, buf[offsetLE:offsetLE+2])

    fmt.Println("\n--- 读取操作示例 ---")

    // 示例3: 从缓冲区的偏移量 127 处读取一个大端序的 uint16
    // 这等同于 Node.js 的 buf.readUInt16BE(127)
    readResultBE := binary.BigEndian.Uint16(buf[offsetBE:])
    fmt.Printf("从 buf[%d:] 读取大端序 uint16: %d\n", offsetBE, readResultBE)

    // 示例4: 从缓冲区的偏移量 255 处读取一个小端序的 uint16
    readResultLE := binary.LittleEndian.Uint16(buf[offsetLE:])
    fmt.Printf("从 buf[%d:] 读取小端序 uint16: %d\n", offsetLE, readResultLE)

    // 验证缓冲区在关键位置的内容
    fmt.Printf("\n缓冲区在偏移量 %d 处的内容 (大端序): %v\n", offsetBE, buf[offsetBE:offsetBE+2])
    fmt.Printf("缓冲区在偏移量 %d 处的内容 (小端序): %v\n", offsetLE, buf[offsetLE:offsetLE+2])
}

示例代码解析

  1. 导入必要的包: encoding/binary 用于字节序转换,fmt 用于输出。
  2. 创建缓冲区: buf := make([]byte, 1024) 创建了一个长度为 1024 字节的切片,作为我们的数据存储区域。
  3. 写入大端序 uint16:
    • binary.BigEndian.PutUint16(buf[offsetBE:], valueBE):这个函数接收一个字节切片作为目标,并将 valueBE (一个 uint16 类型的值) 以大端序写入到该切片的前两个字节。buf[offsetBE:] 创建了一个从指定偏移量开始的新切片视图,PutUint16 会在这个视图的开头写入数据。
  4. 写入小端序 uint16:
    • binary.LittleEndian.PutUint16(buf[offsetLE:], valueLE):与大端序类似,但使用 binary.LittleEndian 对象来确保数据以小端序写入。
  5. 读取大端序 uint16:
    • readResultBE := binary.BigEndian.Uint16(buf[offsetBE:]):这个函数从 buf[offsetBE:] 切片的前两个字节中读取数据,并将其解释为一个大端序的 uint16 值。这正是 Node.js readUInt16BE 的等效功能。
  6. 读取小端序 uint16:
    • readResultLE := binary.LittleEndian.Uint16(buf[offsetLE:]):同样地,使用 binary.LittleEndian 对象从切片中读取小端序的 uint16 值。

注意事项

  • 切片长度: encoding/binary 包的 Uint16 和 PutUint16 函数期望传入的字节切片至少有 2 个字节的长度。如果切片长度不足,程序会发生运行时恐慌(panic)。因此,在实际应用中,需要确保传入的切片有足够的空间来读取或写入数据。Node.js 的 noAssert 参数在 Go 中没有直接对应,Go 开发者需要自行进行边界检查。
  • 字节序匹配: 在读取或写入数据时,必须确保使用的字节序(大端序或小端序)与数据的实际存储或期望格式一致。不匹配的字节序会导致数据解析错误。
  • 其他数据类型: encoding/binary 包不仅支持 uint16,还支持 uint32, uint64, int16, int32, int64 以及浮点数类型(通过 binary.Read 和 binary.Write 配合 binary.LittleEndian 或 binary.BigEndian)。

总结

Go 语言的 encoding/binary 包为处理二进制数据提供了强大而灵活的工具。通过 binary.BigEndian 和 binary.LittleEndian 对象,开发者可以轻松地在字节切片和各种数值类型之间进行转换,并精确控制字节序。实现 Node.js readUInt16BE 功能的核心在于理解字节序的概念,并正确使用 binary.BigEndian.Uint16() 函数。掌握这些技能对于进行网络通信、文件解析或任何需要低级别二进制数据操作的 Go 项目都至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

338

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

225

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

56

2025.09.03

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

531

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

6310

2023.08.17

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 10.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号