Golang は、プログラマーがさまざまなタスクを処理しやすくするための豊富な組み込み関数とデータ型のセットを提供する最新のプログラミング言語です。エンディアン変換も非常に重要な操作です。この記事では、Golang でエンディアン変換を実行する方法について詳しく説明します。
バイトオーダーとは何ですか?
コンピュータのストレージでは、バイトがストレージの最小単位であり、各バイトは 8 ビットのバイナリで構成されます。エンディアンネスとは、整数や浮動小数点数などのマルチバイト データを格納するときにメモリ内でバイトが配置される順序を指します。バイトオーダーには、ビッグエンディアンとリトルエンディアンの 2 種類があります。
ビッグエンディアンとは、上位バイトが最初、下位バイトが最後になる記憶方式を指し、ネットワーク伝送やほとんどのコンピュータの CPU で一般的に使用されています。たとえば、数値 10 のバイナリ表現は 0000 1010 です。ビッグエンディアン順序で格納された場合、メモリ内の順序は 0000 1010 になります。
リトル エンディアンは、下位バイトが最初で上位バイトが最後になる記憶方式で、Intel x86 や ARM アーキテクチャなどの一部のプロセッサ アーキテクチャで一般的に使用されています。たとえば、リトルエンディアン ストレージ内の数値 10 の順序は 1010 0000 です。
Golang でのエンディアン変換
Golang ではエンディアン変換は主に標準ライブラリの「encoding/binary」パッケージを使用します。このパッケージは、バイナリのデコードとエンコード、ビッグエンディアンとスモールエンディアンの変換など、バイトオーダーを変換するためのいくつかの関数を提供します。
「encoding/binary」パッケージの「Read」シリーズの関数は、バイト ストリームを対応するデータ型にデコードするために使用されます。このうち「binary.Read」関数には、入力バイトストリーム、対象オブジェクトへのポインタ、使用するエンディアンタイプの3つのパラメータがあります。例:
func main() { bytes := []byte{0x10, 0x27, 0x00, 0x00} var i int32 err := binary.Read(bytes.NewReader(bytes), binary.LittleEndian, &i) if err != nil { log.Fatal("binary.Read failed:", err) } fmt.Println(i) // Output: 10000 }
上記のコードは、バイト ストリーム [0x10, 0x27, 0x00, 0x00] をリトルエンディアン順に int32 型の変数 i にデコードします。
「encoding/binary」パッケージの「Write」シリーズの関数は、データ型を指定されたバイトのバイナリ ストリームにエンコードするために使用されます。注文。このうち「binary.Write」関数には、出力バイトストリーム、使用するエンディアンタイプ、エンコードする値の3つのパラメータがあります。例:
func main() { var i int32 = 10000 buf := new(bytes.Buffer) err := binary.Write(buf, binary.LittleEndian, i) if err != nil { log.Fatal("binary.Write failed:", err) } fmt.Println(buf.Bytes()) // Output: [0x10 0x27 0x00 0x00] }
上記のコードは、値 10000 の int32 型変数 i を、リトル エンディアンのバイト順序でバイト ストリーム [0x10, 0x27, 0x00, 0x00] にエンコードします。
上記のバイナリ デコードとエンコードに加えて、「エンコード/バイナリ」パッケージには、バイト オーダーを変換するための 2 つの関数も提供されます。 BigEndianそしてリトルエンディアン。
「BigEndian」はネットワーク バイト オーダー (ビッグ エンディアン) でデータ型をエンコードおよびデコードし、「LittleEndian」はリトル エンディアン オーダーでデータ型をエンコードおよびデコードします。例:
func main() { var i int32 = 10000 buf := new(bytes.Buffer) binary.Write(buf, binary.BigEndian, i) fmt.Println(buf.Bytes()) // Output: [0x27 0x10 0x00 0x00] buf.Reset() binary.Write(buf, binary.LittleEndian, i) fmt.Println(buf.Bytes()) // Output: [0x10 0x27 0x00 0x00] }
上記のコードは、int32 型変数 i をビッグ エンディアンとリトル エンディアンの順序でエンコードし、出力バイト ストリームはそれぞれ [0x27, 0x10, 0x00, 0x00] と [0x10, 0x27, 0x00] になります。 、0x00]。
概要
Golang の「encoding/binary」パッケージは、バイナリのデコードとエンコード、ビッグエンディアン変換など、バイトオーダー変換のための豊富な関数を提供します。これらの機能を利用することで、開発者はエンディアン変換を容易に行うことができ、マルチバイトデータの保存や送信も容易に行うことができます。
以上がgolangのバイトオーダー変換の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。