問題タブ [endianness]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unicode - ビッグエンディアンとリトルエンディアンのバイト順序の違い
ビッグエンディアンとリトルエンディアンのバイト順序の違いは何ですか?
これらは両方ともUnicodeとUTF16に関連しているようです。これはどこで正確に使用しますか?
c - ビットフィールド構造体のエンディアン変換
ビット フィールド構造をリトル エンディアンからビッグ エンディアン アーキテクチャに変換する必要があります。単純に構造要素を交換すると、バイト境界に問題が発生するため、これを行う最善の方法は何ですか。
Ex構造は次のとおりです。
endianness - 20年後の互換性の問題は20年後に存在しますか?
CR / LF、さまざまなスラッシュタイプ、またはビッグエンディアンとリトルエンディアンのバグが原因で問題を追跡するのに費やした人生の43日目のようなものはありません。これらの問題は20年前のものであり、人間がまだ穴居人であるかのように感じさせます。これらの古い問題を新しい問題に置き換えるだけですか?XMLは役に立ちましたが、これらの問題は企業に何百万もの時間、お金、労力を費やしていませんか?ベンダーロックインを宣伝するのは陰謀ですか?
perl - グループ化された 16 進文字を Perl でビット文字列に変換する
ビット フラグのシーケンスを表す 16 進文字の 256 文字の文字列があり、それらをビット文字列に変換して&
、|
、vec
などで操作できるようにしようとしています。16 進文字列は、整数幅のビッグ エンディアン グループに書き込まれます。たとえば、8 バイトのグループがビット文字列 に"76543210"
変換されます。"\x10\x32\x54\x76"
つまり、最下位の 8 ビットは00001000
です。
問題は、pack
" h
" 形式が一度に 8 バイトではなく 1 バイトの入力に対して機能するため、直接使用しただけでは正しい順序で結果が得られないことです。現時点では、私はこれをやっています:
これは機能しますが、ハックな感じがします。もっときれいな方法があるはずですが、私のpack
-fu はあまり強くありません。この翻訳を行うためのより良い方法はありますか?
c++ - ビッグエンディアン構造体をリトルエンディアン構造体に変換するにはどうすればよいですか?
UNIXマシンで作成されたバイナリファイルがあります。それは次々に書かれたレコードの集まりです。レコードは次のように定義されます。
私は、Windowsマシンでこのデータをどのように読み取って解釈するかを理解しようとしています。私はこのようなものを持っています:
たくさんのデータを取得しましたが、期待するデータではありません。私の問題はマシンのエンディアンの違いに関係しているのではないかと思うので、それについて質問するようになりました。
複数のバイトがWindowsではリトルエンディアンに、UNIX環境ではビッグエンディアンに格納されることを理解しています。2バイトの場合、Windowsの0x1234はUNIXシステムの0x3412になります。
エンディアンは、構造体全体のバイト順序に影響しますか、それとも構造体の個々のメンバーのバイト順序に影響しますか?UNIXシステムで作成された構造体をWindowsシステムで同じデータを持つ構造体に変換するにはどのようなアプローチが必要ですか?数バイトのバイトオーダーよりも深いリンクも素晴らしいでしょう!
c - 8 ビット フィールドにエンディアンがあるのはなぜですか?
/netinet/tcp.h の TCP ヘッダーの定義を参照してください。
8 ビット フィールドのエンディアンの順序が異なるのはなぜですか? 16 ビットと 32 ビットのフィールドのみがバイト オーダーに関係し、それぞれ ntohs と ntohl を使用してエンディアン間で変換できると思いました。8ビットのものを処理するための関数は何ですか? 何もない場合、リトル エンディアン マシンでこのヘッダーを使用する TCP は、ビッグ エンディアン マシンの TCP では機能しないようです。
c - Linuxユーザースペースでのバイト順序のサポート
組み込みシステムから生成されたコアファイルを分析するために、LinuxでCのプログラムを書いています。コアファイルはリトルエンディアン(ARM)またはビッグエンディアン(MIPS)であり、それらを分析するプログラムはリトルエンディアンホスト(x86)またはビッグエンディアン(PowerPC)で実行されている可能性があります。
ヘッダーを見ると、コアがLEかBEかがわかります。プログラムが実行されているホストがリトルエンディアンかビッグエンディアンかを知る必要はなく、 APIを使用して処理したいと思います。これ以上の選択肢がない場合は、#ifdef__BIG_ENDIAN__に依存し始めると思います。
Linuxカーネルには、ネイティブバイト順序からリトルエンディアンなどに変換するcpu_to_le32 et alがあります。ユーザースペースには、ネイティブからビッグエンディアンに変換するhtonl et alがありますが、ネイティブからリトルエンディアンに相当するものはありません。
誰かがユーザースペースに適したAPIを提案できますか?
編集:明確にするために、CPUがビッグエンディアンかリトルエンディアンかをすでに認識しており、それに応じてバイを交換するAPIを探しています。このためにコードに#ifdefsを散らかす必要はありません。バイトを交換するためのコードスニペットを探しているだけではありません。それらに感謝します、しかしそれはポイントではありませんでした。
.net - BinaryReader.ReadUInt32()がビットパターンを逆にするのはなぜですか?
BinaryReaderクラスでバイナリファイルを読み込もうとしていますが、UInt32のブロックとして読み込み、その後ビットシフトなどを行う必要があります。
しかし、ReadUInt32メソッドを使用すると、何らかの理由でビットの順序が逆になります。
たとえば、最初の4バイトが16進数で次のようになっているファイルがある場合、0x12345678
ReadUInt32で読み取られた後は次のようになります0x78563412
。
ReadBytes(4)メソッドを使用すると、期待される配列が得られます。
どうしてこれなの?.netがメモリ内のuintを表す方法ですか?異なるプラットフォーム間で同じですか(64ビットのWindows 7、.net 3.5 sp1を実行しています)?
endianness - さまざまなエンディネスの利点は何ですか?
一部のプロセッサメーカーが使用を決定したのはなぜですか
- リトルエンディアン
- ビッグエンディアン
- ミドルエンディアン
- 他のもの?
?
ビッグエンディアンを使用すると、数値が負または正の場合、そのビットが最初のビットであるため、より速く見つけることができると聞きました。(これは、個々のビットにアクセスできなくなったため、最近のCPUでは問題になりません。)