golang从文件中读出二进制数据无法还原成结构体
程序目标:
将结构体以二进制方式写入文件。然后从文件读出来,再还原成结构体。
问题:
如果仅仅在内存中操作(代码里获得结构体的二进制后,直接再转成结构体),是可以正常实现的。
但如果将二进制写入文件,再从文件读出来进行还原,就不行了。不知是哪里出了问题。
代码:
1、结构体和二进制进行转换的方法
type MockSlice struct {
Data uintptr
Len uint64
Cap uint64
}
/**
结构体转二进制
*/
func Struct2bin(dataPtr unsafe.Pointer, size uint64) []byte {
ms := &MockSlice{
Data: uintptr(dataPtr),
Len: size,
Cap: size,
}
byteVal := *(*[]byte)(unsafe.Pointer(ms))
return byteVal
}
//二进制转结构体
func Bin2struct( binData []byte) MockSlice {
ms := *(*MockSlice)(unsafe.Pointer(&binData))
return ms
}
2、具体用例代码
//将结构体写入文件
func TestStruct2bin(t *testing.T) {
//构建结构体
w := Width{wid:"宽"}
p := &People{
age: 222,
name: "LY",
}
f := Figure{height:1000,width:[]Width{w}}
p.fig = f
p.age = 1000
p.name = "PPp"
//将结构体转成二进制
rs := Struct2bin(unsafe.Pointer(p),uint64(unsafe.Sizeof(*p)))
//打开文件
file,err := os.OpenFile("D:/minidb/minidb.dict", os.O_RDWR, 0644)
if err != nil {
fmt.Println(err)
}
//将二进制写入文件
binary.Write(file, binary.LittleEndian, rs)
file.Close()
}
//从文件读出二进制,转成结构体
func TestStruct2bin(t *testing.T) {
//打开文件
file,err := os.OpenFile("D:/minidb/minidb.dict", os.O_RDWR, 0644)
if err != nil {
fmt.Println(err)
}
buff := new(bytes.Buffer)
buff.ReadFrom(file)
fmt.Println(buff.Bytes())
//将二进制转成结构体
ms := Bin2struct(buff.Bytes())
fmt.Println(*(*People)(unsafe.Pointer(ms.Data)))
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
单纯从方法名看,内存版本的你操作的都是 struct 实例的 pointer,实例的值始终都在内存中,这就是为什么内存版本的实现可以正常工作;
另外 struct2bin 或 对应结构体中没有定义过具体属性如何打包成二进制,难道这段代码中有神力加持,神来帮你打包?
可以参考下别人的实现:https://github.com/lunixbochs...