ホームページ  >  記事  >  バックエンド開発  >  Golangでビッグエンディアンとスモールエンディアンを変換する方法

Golangでビッグエンディアンとスモールエンディアンを変換する方法

PHPz
PHPzオリジナル
2023-04-24 14:47:391282ブラウズ

コンピュータでは、CPU のバイトオーダーはビッグエンディアンとリトルエンディアンの 2 種類に分けられます。ビッグ エンディアンのバイト オーダーでは、最上位のバイトが最下位のメモリ アドレスに格納され、最下位のバイトが最上位のメモリ アドレスに格納されますが、リトル エンディアンのバイト オーダーではその逆で、最下位のバイトが最下位のメモリ アドレスに格納され、最上位のメモリ アドレスの最上位バイト セクションは最上位のメモリ アドレスに保存されます。

Golang は、ビッグ エンディアンとリトル エンディアンの間で変換するための便利なメソッドをいくつか提供しています。この記事ではGolangにおけるビッグエンディアンとスモールエンディアンの変換方法を紹介します。

実装方法

従来の方法

Golangでは、いくつかの関数を使用してバイトオーダー変換を実現できます。たとえば、encoding/binary パッケージは次の関数を提供します:

  • binary.BigEndian.Uint16
  • binary。 BigEndian.Uint32
  • binary.BigEndian.Uint64
  • #binary.BigEndian.PutUint16
  • binary.BigEndian .PutUint32
  • binary.BigEndian.PutUint64
これらの関数は、プリミティブ型のデータ値をビッグ エンディアンに、またはビッグ エンディアンから変換します。データ値を逆変換します。ビッグエンディアンのバイトオーダーで元の型に変換します。

同時に、

encoding/binary パッケージは、上記の関数と同様のリトルエンディアン バイト オーダー関数

    ##binary も提供します。 LittleEndian.Uint16
  • binary.LittleEndian.Uint32
  • binary.LittleEndian.Uint64
  • binary .LittleEndian.PutUint16
  • binary.LittleEndian.PutUint32
  • binary.LittleEndian.PutUint64
  • これらの関数は、プリミティブ型のデータ値をリトル エンディアン バイト オーダーに変換したり、リトル エンディアン バイト オーダーから変換したりできます。

uint16 型の整数値があり、それをビッグ エンディアンからリトル エンディアンに変換するとします。現時点では、次のコードを使用して実現できます。

var big uint16 = 0x1234
var little uint16 = binary.LittleEndian.Uint16([]byte{byte(big >> 8), byte(big)})

同様に、uint16 型の整数値をリトル エンディアン バイト オーダーからビッグ エンディアン バイト オーダーに変換したい場合は、次のコードを使用できます。コード:

var little uint16 = 0x1234
var big uint16 = binary.BigEndian.Uint16([]byte{byte(little >> 8), byte(little)})

最適化方法

エンディアン変換を実装するプロセスでは、さまざまなタイプのデータにさまざまな最適化方法を使用して、パフォーマンスを向上させることができます。

    2 バイト以下のデータ型: このタイプのデータの場合、
  • encoding/binary

    パッケージ関数を使用せずに、ビット操作を直接実行できます。たとえば、uint16 型の整数値をビッグ エンディアンからリトル エンディアンに変換する場合は、次のコードを使用できます。 <pre class="brush:php;toolbar:false">var big uint16 = 0x1234  var little uint16 = (big &lt;&lt; 8) | (big &gt;&gt; 8)</pre>

  • 2 バイトより大きい データ型:このタイプのデータの場合、
  • unsafe.Pointer

    および reflect パッケージによって提供されるツールを使用して変換し、パフォーマンスを向上させることができます。たとえば、uint32 型の整数値をビッグエンディアンからリトルエンディアンに変換したい場合、次のコードを使用できます: <pre class="brush:php;toolbar:false">value := uint32(0x12345678) var arr [4]byte *(*uint32)(unsafe.Pointer(&amp;arr[0])) = value reflect.Reverse(reflect.ValueOf(arr[:]).Slice(0, 4)) little := *(*uint32)(unsafe.Pointer(&amp;arr[0]))</pre>

    will # A data ##uint32
    • value 型の値は、バイト配列 arr に変換されます。 reflect パッケージのツール関数
    • Reverse
    • を使用して、バイト配列 arr を反転し、ビッグエンディアンのバイトオーダーから変換します。リトルエンディアン。 バイト配列 arr
    • uint32
    • little 型のデータ値に変換します。
    • 概要
  • この記事では、Golang でビッグエンディアン変換を実装する 2 つの方法、つまり従来の方法と最適化された方法を紹介します。従来の方法は、
encoding/binary

パッケージによって提供される関数を通じて実装されており、より読みやすくなっていますが、最適化された方法では、特定のシナリオで変換パフォーマンスを向上させることができます。実際のアプリケーションでは、さまざまなデータ型を変換する方法を選択する必要があります。

以上がGolangでビッグエンディアンとスモールエンディアンを変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。