Golangでビッグエンディアンとスモールエンディアンを変換する方法
コンピュータでは、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
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 型の整数値をビッグ エンディアンからリトル エンディアンに変換する場合は、次のコードを使用できます。
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">var big uint16 = 0x1234 var little uint16 = (big << 8) | (big >> 8)</pre><div class="contentsignin">ログイン後にコピー</div></div>
2 バイトより大きい データ型:このタイプのデータの場合、 - unsafe.Pointer
および
will # A data ##uint32reflect
パッケージによって提供されるツールを使用して変換し、パフォーマンスを向上させることができます。たとえば、uint32
型の整数値をビッグエンディアンからリトルエンディアンに変換したい場合、次のコードを使用できます:<div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">ログイン後にコピー</div></div>
- value
型の値は、バイト配列
arrに変換されます。
reflect
パッケージのツール関数 Reverse - を使用して、バイト配列
arr
を反転し、ビッグエンディアンのバイトオーダーから変換します。リトルエンディアン。バイト配列
arr
を uint32 -
little
型のデータ値に変換します。 概要
この記事では、Golang でビッグエンディアン変換を実装する 2 つの方法、つまり従来の方法と最適化された方法を紹介します。従来の方法は、 - value
パッケージによって提供される関数を通じて実装されており、より読みやすくなっていますが、最適化された方法では、特定のシナリオで変換パフォーマンスを向上させることができます。実際のアプリケーションでは、さまざまなデータ型を変換する方法を選択する必要があります。
以上がGolangでビッグエンディアンとスモールエンディアンを変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











この記事では、Goのパッケージインポートメカニズム:名前付きインポート(例:インポート "fmt&quot;)および空白のインポート(例:_&quot; fmt&quot;)について説明しています。 名前付きインポートはパッケージのコンテンツにアクセス可能になり、空白のインポートはtのみを実行します

この記事では、Webアプリケーションでのページ間データ転送のためのBeegoのnewflash()関数について説明します。 newflash()を使用して、コントローラー間で一時的なメッセージ(成功、エラー、警告)を表示し、セッションメカニズムを活用することに焦点を当てています。 リミア

この記事では、MySQLクエリの結果をGO structスライスに効率的に変換することを詳しく説明しています。 データベース/SQLのスキャン方法を使用して、手動で解析することを避けて強調しています。 DBタグとロブを使用した構造フィールドマッピングのベストプラクティス

この記事では、ユニットテストのためにGOのモックとスタブを作成することを示しています。 インターフェイスの使用を強調し、模擬実装の例を提供し、模擬フォーカスを維持し、アサーションライブラリを使用するなどのベストプラクティスについて説明します。 articl

この記事では、GENICSのGOのカスタムタイプの制約について説明します。 インターフェイスがジェネリック関数の最小タイプ要件をどのように定義するかを詳しく説明し、タイプの安全性とコードの再利用性を改善します。 この記事では、制限とベストプラクティスについても説明しています

この記事では、goで効率的なファイルの書き込みを詳しく説明し、os.writefile(小さなファイルに適している)とos.openfileおよびbuffered write(大規模ファイルに最適)と比較します。 延期エラー処理、Deferを使用し、特定のエラーをチェックすることを強調します。

この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

この記事では、トレースツールを使用してGOアプリケーションの実行フローを分析します。 手動および自動計装技術について説明し、Jaeger、Zipkin、Opentelemetryなどのツールを比較し、効果的なデータの視覚化を強調しています
