如何在Go中读取二进制文件

lau*_*ent 20 file-io go

我是Go的新手,我正在尝试读取二进制文件,一次一个字节或几个字节.文档没有多大帮助,我找不到任何教程或简单的例子(顺便说一下,Google如何为他们的语言提供这样一个不可哄骗的名字?).基本上,我如何打开文件,然后将一些字节读入缓冲区?有什么建议吗?

mna*_*mna 23

对于操作文件,os包是你的朋友:

f, err := os.Open("myfile")
if err != nil {
   panic(err)
}
defer f.Close()
Run Code Online (Sandbox Code Playgroud)

在过去的文件是如何打开更多的控制,看到os.OpenFile()代替(DOC) .

对于阅读文件,有很多方法.(在上面的例子中)os.File返回的类型实现了接口(它有一个带有正确签名的方法),它可以直接用于读取缓冲区中的一些数据(a ),也可以用缓冲读取器包装(类型).os.Openfio.ReaderRead()[]bytebufio.Reader

特别是对于二进制数据,该encoding/binary包可用于将字节序列读入某些类型的数据结构.您可以在此处Go doc中查看示例.该binary.Read()函数可以与使用该os.Open()函数读取的文件一起使用,因为正如我所提到的,它是一个io.Reader.

还有一个简单易用的io/ioutil软件包,它允许你在一个字节切片中一次读取整个文件(ioutil.ReadFile()这需要一个文件名,所以你甚至不必自己打开/关闭文件),或者ioutil.ReadAll()需要a io.Reader并返回包含整个文件的一段字节.这是关于ioutil文档.

最后,正如其他人提到的那样,你可以使用"golang"谷歌关于Go语言,你应该找到所需的一切.该golang螺母邮件列表也是寻找答案的好地方(请务必在发布前先搜索,很多东西已经回答了).要查找第三方软件包,请访问godoc.org网站.

HTH


djh*_*rld 10

这是我用来将整个二进制文件读入内存的方法

func RetrieveROM(filename string) ([]byte, error) {
    file, err := os.Open(filename)

    if err != nil {
        return nil, err
    }
    defer file.Close()

    stats, statsErr := file.Stat()
    if statsErr != nil {
        return nil, statsErr
    }

    var size int64 = stats.Size()
    bytes := make([]byte, size)

    bufr := bufio.NewReader(file)
    _,err = bufr.Read(bytes)

    return bytes, err
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不直接使用Go`io/ioutil`包中的`func ReadFile(filename string)([] byte,error)`? (5认同)
  • @djhworld 有趣,我现在正在用 Go 编写一个模拟器,在谷歌搜索二进制文件后偶然发现了你的答案;) (2认同)

pet*_*rSO 7

例如,要计算文件中的零字节数:

package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    f, err := os.Open("filename")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()
    data := make([]byte, 4096)
    zeroes := 0
    for {
        data = data[:cap(data)]
        n, err := f.Read(data)
        if err != nil {
            if err == io.EOF {
                break
            }
            fmt.Println(err)
            return
        }
        data = data[:n]
        for _, b := range data {
            if b == 0 {
                zeroes++
            }
        }
    }
    fmt.Println("zeroes:", zeroes)
}
Run Code Online (Sandbox Code Playgroud)