golang从文件中读出二进制数据无法还原成结构体

发布于 2022-09-30 23:11:51 字数 1692 浏览 34 评论 0

程序目标:

将结构体以二进制方式写入文件。然后从文件读出来,再还原成结构体。

问题:

如果仅仅在内存中操作(代码里获得结构体的二进制后,直接再转成结构体),是可以正常实现的。
但如果将二进制写入文件,再从文件读出来进行还原,就不行了。不知是哪里出了问题。

代码:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

缱倦旧时光 2022-10-07 23:11:52

单纯从方法名看,内存版本的你操作的都是 struct 实例的 pointer,实例的值始终都在内存中,这就是为什么内存版本的实现可以正常工作;
另外 struct2bin 或 对应结构体中没有定义过具体属性如何打包成二进制,难道这段代码中有神力加持,神来帮你打包?

可以参考下别人的实现:https://github.com/lunixbochs...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文