Go での構造体とバイト配列間の変換
Go では、構造体とバイト配列の間で変換する必要がある状況に遭遇することがあります。または、型キャストやメモリ コピーなどの C に似た操作を実行します。この記事では、これらのタスクの解決策について説明します。
型キャスト
Go は C のような型キャストをサポートしていませんが、unsafe.Pointer 型を使用して同様のことを実行できます。操作。構造体をバイト配列に変換するには、unsafe.Pointer() 関数を使用して、構造体のアドレスをポインターに変換します。
<code class="go">type packet struct { opcode uint16 data [1024]byte } var pkt1 packet // Convert pkt1 to a byte array byteArray := (*[unsafe.Sizeof(pkt1)]byte)(unsafe.Pointer(&pkt1))</code>
バイト配列を構造体に変換するには、unsafe.Pointer を使用します。 () 関数を再度使用して、バイト配列ポインタを目的の構造体タイプにキャストします。
<code class="go">// Convert byteArray back to a packet struct pkt2 := *(**packet)(unsafe.Pointer(&byteArray))</code>
Memory Copy
Go には memcpy と直接同等のものはありません。 () 関数と同様に、copy() 関数を使用してメモリ コピーを実行できます。バイト配列から構造体にデータをコピーするには、次の構文を使用できます。
<code class="go">type file_info struct { file_size uint32 // 4 bytes file_name [1020]byte } var file file_info copy(unsafe.Pointer(&file), pkt1.data) // Copy data from pkt1.data to file</code>
エンコーディング/バイナリ パッケージを使用する
の代わりにunsafe.Pointer を使用すると、エンコーディング/バイナリ パッケージを使用して、構造体とバイト配列間の型変換を処理できます。このパッケージは、バイナリ形式でデータをエンコードおよびデコードするための関数を提供し、エンディアンとデータ サイズの処理を容易にします。
<code class="go">// Convert a struct to a byte array t := T{A: 0xEEFFEEFF, B: 3.14} var buf bytes.Buffer binary.Write(&buf, binary.BigEndian, t) // Encode struct t to buf // Convert a byte array to a struct t2 := T{} binary.Read(&buf, binary.BigEndian, &t2) // Decode byte array buf into struct t2</code>
以上が「ハウツー」形式を念頭に置いて、記事の内容に適した質問ベースのタイトルをいくつか紹介します。 * Go で構造体とバイト配列の間で変換するにはどうすればよいですか? * 構造体をバイト配列に移動の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。