42 lines
1.1 KiB
Markdown
42 lines
1.1 KiB
Markdown
|
# Golang 的大端序和小端序
|
|||
|
|
|||
|
## 什么是大小端序
|
|||
|
|
|||
|
按地址从小到大排序,数据的高位排在前面的为大端序,数据的低位排在前面的为小端序。
|
|||
|
|
|||
|
## Golang 的大小端操作
|
|||
|
|
|||
|
最常见的是将数据转换成 []byte 的过程中尤其需要关注大小端序。Golang 处理大小端序的代码位于 encoding/binary 包。包中的全局变量 BigEndian 用于操作大端序数据,LittleEndian 用于操作小端序数据,这两个变量所对应的数据类型都实行了 ByteOrder 接口:
|
|||
|
|
|||
|
```go
|
|||
|
type ByteOrder interface {
|
|||
|
Uint16([]byte) uint16
|
|||
|
Uint32([]byte) uint32
|
|||
|
Uint64([]byte) uint64
|
|||
|
PutUint16([]byte, uint16)
|
|||
|
PutUint32([]byte, uint32)
|
|||
|
PutUint64([]byte, uint64)
|
|||
|
String() string
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## 示例代码
|
|||
|
|
|||
|
```go
|
|||
|
func ToBigByte(d int32) (b []byte) {
|
|||
|
binary.BigEndian.PutUint32(b, uint32(d))
|
|||
|
}
|
|||
|
|
|||
|
func ToLittleByte(d int32) (b []byte) {
|
|||
|
binary.LittleEndian.PutUint32(b, uint32(d))
|
|||
|
}
|
|||
|
|
|||
|
func FromBigByte(b [4]byte) (d int32) {
|
|||
|
return int32(binary.BigEndian.Uint32(b[0:4]))
|
|||
|
}
|
|||
|
|
|||
|
func FromLittleByte(b [4]byte) (d int32) {
|
|||
|
return int32(binary.LittleEndian.Uint32(b[0:4]))
|
|||
|
}
|
|||
|
```
|