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が安全でないことも知っています。
どんな助けでも大歓迎です。
これを行う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)