質問
これは、任意のプログラミング言語に固有の問題ではありません。あなたはビッグエンディアンのマシン上で書かれたいくつかのファイルを持っている、とあなたはこれを知っていると言います。 2つのシングルバイト値が背中合わせに書かれていた場合、どのようにあなたは知っているだろうか?ビッグエンディアンは16、32、および64ビット値の順序を逆にするので、どのようにあなたは個々のバイトとしてそれを読む必要が知っているだろう?
たとえば、あなたがして、バイトの0x22バイトは0x11を書き込みます。ファイルは、0x1122が含まれています。あなたはリトルエンディアンのマシン上でそれを読めば、あなたはそれを変換する必要があると思います。だから、2211、または1122としてそれを読むのでしょうか?あなたはどのように知っているだろうか?
これはどんな意味がありますか?私はここにスーパー基本的な何かが欠けているような気がします。
解決
知る方法はありません。これは、正式に指定されたファイル形式は一般的にエンディアンを義務付ける、または(MSNが述べたように、ユニコードのように)彼らはオプションを提供する理由です。それはその形式でという事実は、特定のエンディアンを意味しますので、この方法で、あなたが特定の形式のファイルを読んでいるならば、あなたは<全角> を知っているが、それは、すでにビッグエンディアンです。
こののもう一つの良い例は、ネットワークバイトオーダーである - ネットワークプロトコルは、典型的にはビッグエンディアン、あなたはリトルエンディアンプロセッサは、インターネットに話しているのであれば、あなたは後方物事を記述する必要があります。あなたはビッグエンディアンであれば、あなたはそれを心配する必要はありません。人々は htonl、彼らはへの書き込み前処理のものにntohl のような機能を使用しますネットワーク彼らのソースコードは、すべてのマシンで同じになるように。これらの機能は、ビッグエンディアンのマシンで何もしないように定義されたが、彼らはリトルエンディアンのマシンでバイトを反転されます。
キーを実現することがエンディアンがどのように特定ののアーキテクチャのプロパティであることは言葉を表しています。それは彼らがのファイルの特定の方法を記述する必要が任務ではありません。それだけでアーキテクチャ上の命令は、マルチバイトの単語がそのバイトは、特定の方法を注文したことを期待していることを示しています。それはバイトの順序を変更しなければならないのでビッグエンディアンのマシンは、リトルエンディアンのマシンと同じバイトシーケンスを書き込むことができ、それだけで、それを行うために、より少数の命令を使用する場合があります。同じことは、ビッグエンディアンフォーマットを書いリトルエンディアンのマシンのために真である。
他のヒント
あなたが何かを知っているので、あなたはそれ神のいずれかをする必要があります(つまり、あなたは のあなたはビッグエンディアン形式のファイルを読んでいる知っている)か、何らかの形でファイルにエンディアンをエンコードする必要があります。 Unicodeテキストファイルには、エンディアンを計算するために、テキストファイルの最初の2つのバイトとして0xFFFE
(または類似したもの)を使用します。あなたは0xFFFEというようにそれを読めば、それはネイティブ・エンディアン形式であります。あなたは0xfeffとしてそれを読めば、そうではありません。
あなたは正確に正しい...あなたが見ているデータのいくつかのアイデアなしで、知る方法はありません。
できれば言われて、推測する方法は...あなたがテキストを見ることになっている知っているならば、あなたは何を取得していることは合理的であるかどうかを確認するためにいくつかの簡単なテストを実行できます...多くの場合があることヘッダを読み出し、あなたはそれからそれしばしば神のことができます...しかし、あなただけのバイトストリームを見ている場合は、のの知るへの確実な方法はありません。
これはどんな意味があるか?
はい:それは問題だ。
私はここにスーパー基本的な何かが欠けているように、シングル、ダブルバイトワードがあり、バイトのペアは、個々のバイトのシーケンスであるかどうかを知ることが含まれる、または:私は感じています。
基本的には、ファイル(特にバイナリファイル)を読むために、あなたはファイル形式を知っている必要があります。 P>
あなたは何が不足していません。 (例えば、エクセル97-2003 XLSワークブックなど)明確に定義されたバイナリファイル形式は、エンディアン仕様の一部として、または、あなたは大きな問題を明らかにしています。
歴史的に、Macintoshは、IBM PC / DOS / Windowsコンピュータが常にリトルエンディアンですIntelプロセッサを使用している一方で、ビッグエンディアンだったモトローラ・プロセッサ(68000およびそれの後継)を使用しました。少なくとも彼らのために - アップルがインテルに切り替える前に、必ずWindowsソフトウェア、またはMac用ソフトウェアを開発しているソフトウェアvendoresは、単にそれを無視してきたかもしれないがだから、両方のプラットフォーム上で動作するC / C ++のコードベースを持つソフトウェアベンダーは、この問題に非常に慣れています独自のファイル形式ます。
これは例えば、PCAPファイル形式は変数エンディアンを指定し、あなたが求めている正確に何で、そうでない場合を確認します。
http://www.winpcap.org/ntar/draft/PCAP -DumpFileFormat.htmlする
のコンセプトは、あなたのファイルのヘッダには、そのような0x12345678のように、「マーカー」のバイトを書くことができるということです。次のようなPowerPCのような「ビッグエンディアン」マシンでは、それが書き込まれます。
の0x12 0x34の0x56 0x78と
次のようにx86など「リトルエンディアン」マシンでは、それが書き込まれます。
0x78と0x56 0x34の0x12を
あなたのヘッダを読み込む際に続いて、あなたははのマシンはファイルを読みながらバイトをスワップする必要があるかどうかを判断するために読み出すものによって言うことができます。それとも、このようなビッグエンディアンとして、エンディアンを指定することもできます。そして、あなたは常にリトルエンディアンのマシン上でバイトをスワップします。
は、PCAPフォーマットの場合、これはパフォーマンス上の理由のために行われました。しかし、それは、指定しエンディアンとそれに固執することはおそらく簡単です。
プロセッサは、一方または他方のエンディアンモード(一部のページ、等に基づいて切り替えることができる)で動作します。彼らは正しいことをやったりしていない場合、彼らははを知りません。彼らはちょうど彼らが何をやります。 (ごみは、ごみアウト): - )
私が言うと思い検出する方法はありません。しかし、C#でBitConverterはIsLittleEndian-propertieを持っています。
それはすべてあなたがそれをenterpretしたいかによって異なります。
ここをより多くのをお読みます。