Подтвердить что ты не робот

Как читать двоичный файл в Go

Я совершенно новичок в Go, и я пытаюсь прочитать двоичный файл, байтовый байт или несколько байтов за раз. Документация мало помогает, и я не могу найти какой-либо учебник или простой пример (кстати, как Google мог бы назвать свой язык таким несовместимым именем?). В принципе, как я могу открыть файл, а затем прочитать несколько байтов в буфер? Любое предложение?

4b9b3361

Ответ 1

Для управления файлами пакет os - ваш друг:

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

Для большего контроля над тем, как файл открыт, см. os.OpenFile() вместо (doc).

Для чтения файлов существует много способов. Тип os.File, возвращаемый os.Open (f в приведенном выше примере) реализует интерфейс io.Reader (у него есть метод Read() с правой подписью), его можно использовать непосредственно для чтения некоторых данных в буфера (a []byte), или его также можно обернуть в буферизованное считывающее устройство (тип bufio.Reader).

В частности, для двоичных данных пакет encoding/binary может быть полезен для чтения последовательности байтов в некоторой типизированной структуре данных. Вы можете увидеть пример в Go doc here. Функция binary.Read() может использоваться с файлом, считанным с помощью функции os.Open(), поскольку, как я уже упоминал, это io.Reader.

А также простой в использовании пакет io/ioutil, который позволяет вам читать весь файл сразу в байтовом фрагменте (ioutil.ReadFile(), который принимает имя файла, поэтому вам даже не нужно открывать/закройте файл самостоятельно) или ioutil.ReadAll(), который принимает io.Reader и возвращает кусок байтов, содержащий весь файл. Здесь doc на ioutil.

Наконец, как упоминалось выше, вы можете google о языке Go, используя "golang", и вы должны найти все, что вам нужно. список рассылки golang-nuts - также отличное место для поиска ответов (убедитесь, что вы искали сначала перед публикацией, многие вещи уже были ответил). Чтобы посмотреть сторонние пакеты, проверьте godoc.org.

НТН

Ответ 2

Например, чтобы подсчитать количество нулевых байтов в файле:

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

Ответ 3

Это то, что я использую для чтения всего двоичного файла в памяти

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
}

Ответ 4

Вы не можете причудливо применять примитивные типы к (char *), как в C, поэтому для любого типа (де) сериализации двоичных данных используется кодирование/двоичный пакет. http://golang.org/pkg/encoding/binary. Я не могу улучшить примеры там.