# 日報(2020-08-23) go で バイナリファイルの編集
バイナリファイルをいじる時はどんな言語でもこんな手順だとおもうのですが
- ファイルを開く
- ファイルポインタを seek
- ファイルに書き込む
- ファイルを閉じる
以外と楽チンなのが bash で こちら (opens new window) の記事にあるとおり
echo -n "xxxxxxxx" | dd of=バイナリファイル bs=1 seek=書き込み位置(byte) conv=notrunc
と dd 一発で、やっぱ bash は楽だなと思っていたのですが、go の os.WriteAt() (opens new window) が地味に便利で
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
第2引数にファイル先頭からのオフセットが書けるのですが、そこまで seek して書いてくれます
Bash 以外だとどんな言語でも seek して、書いてって2手必要だとおもってたのですがそれが1手ですむ go ってなんかコーダー目線なライブラリを提供してくれててうれしいです。地味とか書きましたけど、囲碁だと1手違ったら逆転しちゃうぐらい大きいです
書き込みのために 4 バイトの整数を little endian なバイト列にするのに
valueHexLittleEnd := []byte{byte(seed % 0x100), byte((seed / 0x100) % 0x100), byte((seed / 0x10000) % 0x100), byte((seed / 0x1000000) % 0x100)}
とかやってたのですが、こちらの SOの記事 (opens new window) を見てしまって「うっ...」ってなりました
i := int64(-123456789)
fmt.Println(i)
b := make([]byte, 8)
binary.LittleEndian.PutUint64(b, uint64(i))
fmt.Println(b)
i = int64(binary.LittleEndian.Uint64(b))
fmt.Println(i)
binary.LittleEndian (opens new window) なんてモジュールがあったんだ!これ便利じゃん!
go はコーダー目線でありがたいなぁと改めて思いました