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

大qs_icezhou
  • 8

程序目标:

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

问题:

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

代码:

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)))

}
回复
阅读 777
1 个回答

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏