コンピュータでは、CPU のバイトオーダーはビッグエンディアンとリトルエンディアンの 2 種類に分けられます。ビッグ エンディアンのバイト オーダーでは、最上位のバイトが最下位のメモリ アドレスに格納され、最下位のバイトが最上位のメモリ アドレスに格納されますが、リトル エンディアンのバイト オーダーではその逆で、最下位のバイトが最下位のメモリ アドレスに格納され、最上位のメモリ アドレスの最上位バイト セクションは最上位のメモリ アドレスに保存されます。
Golang は、ビッグ エンディアンとリトル エンディアンの間で変換するための便利なメソッドをいくつか提供しています。この記事ではGolangにおけるビッグエンディアンとスモールエンディアンの変換方法を紹介します。
Golangでは、いくつかの関数を使用してバイトオーダー変換を実現できます。たとえば、encoding/binary
パッケージは次の関数を提供します:
binary.BigEndian.Uint16
binary。 BigEndian.Uint32
binary.BigEndian.Uint64
encoding/binary パッケージは、上記の関数と同様のリトルエンディアン バイト オーダー関数
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)})
最適化方法
パッケージ関数を使用せずに、ビット操作を直接実行できます。たとえば、uint16 型の整数値をビッグ エンディアンからリトル エンディアンに変換する場合は、次のコードを使用できます。 <pre class="brush:php;toolbar:false">var big uint16 = 0x1234
var little uint16 = (big << 8) | (big >> 8)</pre>
および reflect
パッケージによって提供されるツールを使用して変換し、パフォーマンスを向上させることができます。たとえば、uint32
型の整数値をビッグエンディアンからリトルエンディアンに変換したい場合、次のコードを使用できます: <pre class="brush:php;toolbar:false">value := uint32(0x12345678)
var arr [4]byte
*(*uint32)(unsafe.Pointer(&arr[0])) = value
reflect.Reverse(reflect.ValueOf(arr[:]).Slice(0, 4))
little := *(*uint32)(unsafe.Pointer(&arr[0]))</pre>
型の値は、バイト配列
arr に変換されます。
reflect
パッケージのツール関数 arr
を反転し、ビッグエンディアンのバイトオーダーから変換します。リトルエンディアン。
バイト配列 arr
を little
型のデータ値に変換します。
以上がGolangでビッグエンディアンとスモールエンディアンを変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。