70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
package sm
|
|
|
|
import (
|
|
"encoding/binary"
|
|
)
|
|
|
|
// GM/T 0018中,bits等uint转为字节串时,没有规定大小端序列。这里可以设置按哪种端序进行处理。
|
|
// 更新:从字符串转为struct时可以忽略端序,不管大小端,代码中分别进行如下判断。
|
|
// 比如[]byte{00,01,00,00}. 小端序为0x00000100 = 256,大端序为0x00010000.
|
|
// 可以根据上下文判断是否超过最大值而采用某种端序。
|
|
|
|
type endian struct {
|
|
isBigEndian bool
|
|
}
|
|
|
|
func (e *endian) PutUint32(b []byte, v uint32) {
|
|
if e.isBigEndian {
|
|
binary.BigEndian.PutUint32(b, v)
|
|
} else {
|
|
binary.LittleEndian.PutUint32(b, v)
|
|
}
|
|
}
|
|
|
|
func (e *endian) Uint32(b []byte) uint32 {
|
|
if e.isBigEndian {
|
|
return binary.BigEndian.Uint32(b)
|
|
}
|
|
return binary.LittleEndian.Uint32(b)
|
|
|
|
}
|
|
|
|
var (
|
|
// Endian marshal时int类型的存储端序 - 默认为大端序
|
|
Endian = endian{true}
|
|
)
|
|
|
|
var callBackSetToBigEndian []func()
|
|
var callBackSetToLittleEndian []func()
|
|
var callBackSetToDefaultEndian []func()
|
|
|
|
func RegisterCallBack(setToBigEndian, setToLittleEndian, setToDefaultEndian func()) {
|
|
callBackSetToBigEndian = append(callBackSetToBigEndian, setToBigEndian)
|
|
callBackSetToLittleEndian = append(callBackSetToLittleEndian, setToLittleEndian)
|
|
callBackSetToDefaultEndian = append(callBackSetToDefaultEndian, setToDefaultEndian)
|
|
}
|
|
|
|
// SetToBigEndian 将端序设置为大端序
|
|
func SetToBigEndian() {
|
|
Endian.isBigEndian = true
|
|
for _, f := range callBackSetToBigEndian {
|
|
f()
|
|
}
|
|
}
|
|
|
|
// SetToLittleEndian 设置为小端序
|
|
func SetToLittleEndian() {
|
|
Endian.isBigEndian = false
|
|
for _, f := range callBackSetToLittleEndian {
|
|
f()
|
|
}
|
|
}
|
|
|
|
// SetToDefaultEndian 恢复默认端序-大端
|
|
func SetToDefaultEndian() {
|
|
Endian.isBigEndian = true
|
|
for _, f := range callBackSetToDefaultEndian {
|
|
f()
|
|
}
|
|
}
|