Go struct和[]byte互相转换学习笔记
unsafe 包处理二进制
type MsgLogon struct {
SenderCompID [20]byte
TargetCompID [20]byte
HeartBtInt int32
Password [16]byte
DefaultApplVerID [32]byte
}
//unsafe包处理二进制
//struct转为[]byte
func StructToBytes(iter interface{}, len int) []byte {
var x reflect.SliceHeader
x.Len = len
x.Cap = len
x.Data = reflect.ValueOf(iter).Pointer()
return *(*[]byte)(unsafe.Pointer(&x))
}
//[]byte转为struct
func BytesToStruct(buf []byte) unsafe.Pointer {
return unsafe.Pointer(
(*reflect.SliceHeader)(unsafe.Pointer(&buf)).Data,
)
}
//struct转为[]byte
buf := StructToBytes(logon, binary.Size(logon))
//[]byte转为struct
logon := (*MsgLogon)(BytesToStruct(bs2))
binary 包处理二进制
//binary包处理二进制
//struct转换为[]byte
func Encode(data interface{}, order binary.ByteOrder) ([]byte, error) {
buf := bytes.NewBuffer([]byte{})
err := binary.Write(buf, order, data)
if err != nil{
panic(err)
}
return buf.Bytes(), nil
}
//将[]byte转换为struct
func Decode(b []byte, order binary.ByteOrder, data interface{}) error{
buf := bytes.NewBuffer(b)
err := binary.Read(buf, order, data)
return err
}
//测试
buf, _ := Encode(logon)
var logon MsgLogon
Decode(buf, &logon)
一直没有找到合适的转换方式,查了很多,处理思想都是这样,在这里只是将转换方式写成通用的方法,记录下。
参考
https://my.oschina.net/solate/blog/2998321