web-dev-qa-db-ja.com

golang:uint32(または任意の組み込み型)を[] byte(ファイルに書き込む)に変換します

nsafeライブラリを使用して、Goでuint32をバイト配列(4バイト)に変換しようとしています。

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h)
a := make([]byte, unsafe.Sizeof(h))
copy(a, *(*[]byte)(unsafe.Pointer(&h)))

最初の2行は正しいですが、copy呼び出しでランタイムエラー(予期しない障害アドレス)が発生します。

次のステップは、Writeを呼び出すことです。

_, err = fi.Write(a)

4バイトをファイルに書き込みます。

同様のトピックを持つ他の質問を見つけましたが、動作するコードはありません。 unsafeが安全でないことも知っています。

どんな助けでも大歓迎です。

12
Mike Fernandez

これを行う1つの方法は次のとおりです。

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h)
a := (*[4]byte)(unsafe.Pointer(&h))[:]

これが何が起こっているかの内訳です。コード

(*[4]byte)(unsafe.Pointer(&h))

uint32ポインタを[4]バイトポインタに変換します。ザ・

[:]

最後に[4]バイトにスライスを作成します。

問題のコードは、uint32を スライスヘッダー として解釈します。結果のスライスは無効であり、copyに障害があります。

安全でないものを使用しない別のアプローチは、 encoding/binary パッケージを使用することです。

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h)
a := make([]byte, 4)
binary.LittleEndian.PutUint32(a, h)
12
Cerise Limón