golangのバイトオーダー変換

PHPz
リリース: 2023-05-14 15:03:37
オリジナル
731 人が閲覧しました

Golang は、プログラマーがさまざまなタスクを処理しやすくするための豊富な組み込み関数とデータ型のセットを提供する最新のプログラミング言語です。エンディアン変換も非常に重要な操作です。この記事では、Golang でエンディアン変換を実行する方法について詳しく説明します。

バイトオーダーとは何ですか?

コンピュータのストレージでは、バイトがストレージの最小単位であり、各バイトは 8 ビットのバイナリで構成されます。エンディアンネスとは、整数や浮動小数点数などのマルチバイト データを格納するときにメモリ内でバイトが配置される順序を指します。バイトオーダーには、ビッグエンディアンとリトルエンディアンの 2 種類があります。

ビッグエンディアンとは、上位バイトが最初、下位バイトが最後になる記憶方式を指し、ネットワーク伝送やほとんどのコンピュータの CPU で一般的に使用されています。たとえば、数値 10 のバイナリ表現は 0000 1010 です。ビッグエンディアン順序で格納された場合、メモリ内の順序は 0000 1010 になります。

リトル エンディアンは、下位バイトが最初で上位バイトが最後になる記憶方式で、Intel x86 や ARM アーキテクチャなどの一部のプロセッサ アーキテクチャで一般的に使用されています。たとえば、リトルエンディアン ストレージ内の数値 10 の順序は 1010 0000 です。

Golang でのエンディアン変換

Golang ではエンディアン変換は主に標準ライブラリの「encoding/binary」パッケージを使用します。このパッケージは、バイナリのデコードとエンコード、ビッグエンディアンとスモールエンディアンの変換など、バイトオーダーを変換するためのいくつかの関数を提供します。

  1. バイナリ デコード

「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 にデコードします。

  1. バイナリ エンコード

「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] にエンコードします。

  1. ビッグ エンディアンとスモール エンディアンの変換

上記のバイナリ デコードとエンコードに加えて、「エンコード/バイナリ」パッケージには、バイト オーダーを変換するための 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート