代码之家  ›  专栏  ›  技术社区  ›  nos

将Golang二进制文件读入切片数据,结果为零

  •  1
  • nos  · 技术社区  · 2 年前

    我想把二进制数据读写到文件中,我的数据就是简单的切片。编码部分正在工作,但我的解码通过 binary.Read 结果为零。我做错了什么?

        data := []int16{1, 2, 3}
        buf := new(bytes.Buffer)
        err := binary.Write(buf, binary.LittleEndian, data)
        if err != nil {
            fmt.Println("binary.Write failed:", err)
        }
        fmt.Println(buf.Bytes())
        // working up to this point
    
        r := bytes.NewReader(buf.Bytes())
        got := []int16{}
        if err := binary.Read(r, binary.LittleEndian, &got); err != nil {
            fmt.Println("binary.Read failed:")
        }
        fmt.Println("got:", got)
    

    运行这段代码

    [1 0 2 0 3 0]
    got: []
    

    游乐场链接如下: https://go.dev/play/p/yZOkwXj8BNv

    1 回复  |  直到 2 年前
        1
  •  1
  •   blackgreen    2 年前

    你必须使你的片尽可能大,因为你想从缓冲区读取。因为get的长度为零,所以得到的结果为空。

    got := make([]int16, buf.Len()/2)
    if err := binary.Read(buf, binary.LittleEndian, &got); err != nil {
        fmt.Println("binary.Read failed:")
    }
    

    正如JimB所说,您可以直接从缓冲区读取数据。

    另请参见 binary.Read

    Read将结构化二进制数据从r读入数据。数据必须是指向固定大小值或固定大小值片段的指针。从r读取的字节使用指定的字节顺序进行解码,并写入数据的连续字段。[...]