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