golang Endian字节序
johnL · · 2894 次点击 · · 开始浏览golang 字节序
简述
最近看TCP通信发现字节序,对此不太了解,故记录下来。
所谓字节序就是字符顺序。在查看资料常用的有2类排序方式:
-
Big-Endian
高位字节放在内存的低地址端,低位字节放在内存的高地址端。
-
Little-Endian
低位字节放在内存的低地址段,高位字节放在内存的高地址端。
例如
十进制数255用二进制表示为1111 1111,十进制数256用二进制表示则为1 0000 0000那么这个1存放的位置是在前还是后,就是 Big-Endian 和 ittle-Endian 的区别
golang中
在golang 中 encoding/binary 提供了二进制序列化的功能。
提供read 读取编码 和write写编码的等方法
func Read(r io.Reader, order ByteOrder, data interface{}) error
func Write(w io.Writer, order ByteOrder, data interface{}) error
及一个排序接口
type ByteOrder interface {
Uint16([]byte) uint16
Uint32([]byte) uint32
Uint64([]byte) uint64
PutUint16([]byte, uint16)
PutUint32([]byte, uint32)
PutUint64([]byte, uint64)
String() string
}
type littleEndian struct{}
type bigEndian struct{}
bigEndian和littleEndian实现了接口方法。
例如
利用 Write 进行编码得到如下结果:
ioTest := bytes.NewBuffer(make([]byte,0,1024))
binary.Write(ioTest,binary.LittleEndian,uint32(10))
fmt.Println(ioTest.Next(4)) // [10 0 0 0]
binary.Write(ioTest,binary.BigEndian,uint32(10))
fmt.Println(ioTest.Next(4) // [0 0 0 10]
利用read去读 编码中的数据:
ioTest := bytes.NewBuffer(make([]byte,0,1024))
binary.Write(ioTest,binary.BigEndian,uint32(10))
ioLen :=uint32(0)
binary.Read(ioTest,binary.BigEndian,&ioLen)
fmt.Println(ioLen) // 10
ioLen :=uint32(0)
binary.Read(ioTest,binary.LittleEndian,&ioLen)
fmt.Println(ioLen) // 167772160 因为序列不一样,值按照小端序得来。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
golang 字节序
简述
最近看TCP通信发现字节序,对此不太了解,故记录下来。
所谓字节序就是字符顺序。在查看资料常用的有2类排序方式:
-
Big-Endian
高位字节放在内存的低地址端,低位字节放在内存的高地址端。
-
Little-Endian
低位字节放在内存的低地址段,高位字节放在内存的高地址端。
例如
十进制数255用二进制表示为1111 1111,十进制数256用二进制表示则为1 0000 0000那么这个1存放的位置是在前还是后,就是 Big-Endian 和 ittle-Endian 的区别
golang中
在golang 中 encoding/binary 提供了二进制序列化的功能。
提供read 读取编码 和write写编码的等方法
func Read(r io.Reader, order ByteOrder, data interface{}) error
func Write(w io.Writer, order ByteOrder, data interface{}) error
及一个排序接口
type ByteOrder interface {
Uint16([]byte) uint16
Uint32([]byte) uint32
Uint64([]byte) uint64
PutUint16([]byte, uint16)
PutUint32([]byte, uint32)
PutUint64([]byte, uint64)
String() string
}
type littleEndian struct{}
type bigEndian struct{}
bigEndian和littleEndian实现了接口方法。
例如
利用 Write 进行编码得到如下结果:
ioTest := bytes.NewBuffer(make([]byte,0,1024))
binary.Write(ioTest,binary.LittleEndian,uint32(10))
fmt.Println(ioTest.Next(4)) // [10 0 0 0]
binary.Write(ioTest,binary.BigEndian,uint32(10))
fmt.Println(ioTest.Next(4) // [0 0 0 10]
利用read去读 编码中的数据:
ioTest := bytes.NewBuffer(make([]byte,0,1024))
binary.Write(ioTest,binary.BigEndian,uint32(10))
ioLen :=uint32(0)
binary.Read(ioTest,binary.BigEndian,&ioLen)
fmt.Println(ioLen) // 10
ioLen :=uint32(0)
binary.Read(ioTest,binary.LittleEndian,&ioLen)
fmt.Println(ioLen) // 167772160 因为序列不一样,值按照小端序得来。