2

これは、プログラミング言語に固有の質問ではありません。ビッグエンディアンのマシンで書かれたファイルがあり、これを知っているとします。2 つの 1 バイト値が連続して書き込まれた場合、どうすればわかりますか? ビッグエンディアンは 16、32、および 64 ビット値の順序を逆にしますが、それを個々のバイトとして読み取る必要があることをどのように知ることができますか?

たとえば、バイト 0x11 を書き込み、次にバイト 0x22 を書き込みます。ファイルには 0x1122 が含まれます。リトル エンディアン マシンでそれを読む場合は、変換する必要があります。では、2211 と読むか、1122 と読むか。どのように知っていますか?

これは意味がありますか?ここで超基本的な何かが欠けているように感じます。

4

8 に答える 8

6

知る方法はありません。これが、正式に指定されたファイル形式が通常、エンディアンを義務付けるか、オプションを提供する理由です (MSN が述べたように、Unicode と同様に)。このようにして、特定の形式のファイルを読み取っている場合、その形式であるという事実は特定のエンディアンを意味するため、それがすでにビッグエンディアンである ことがわかります。

これのもう 1 つの良い例は、ネットワーク バイト オーダーです。ネットワーク プロトコルは通常、ビッグ エンディアンです。そのため、インターネットと通信するリトルエンディアン プロセッサの場合は、逆に記述する必要があります。ビッグエンディアンなら気にする必要はありません。htonl や ntohlなどの関数を使用して、ネットワークに書き込む内容を前処理し、ソース コードがすべてのマシンで同じになるようにします。これらの関数は、ビッグ エンディアン マシンでは何もしないように定義されていますが、リトル エンディアン マシンではバイトを反転します。

重要な認識は、エンディアンが特定のアーキテクチャが単語を表現する方法のプロパティであるということです。特定の方法でファイルを作成しなければならないという義務はありません。アーキテクチャ上の命令では、マルチバイト ワードのバイトが特定の順序で並べられることを期待していることを示しているだけです。ビッグ エンディアン マシンは、リトル エンディアン マシンと同じバイト シーケンスを書き込むことができますが、バイトを並べ替える必要があるため、それを行うためにさらにいくつかの命令を使用する場合があります。同じことは、ビッグ エンディアン形式を書き込むリトル エンディアン マシンにも当てはまります。

于 2009-01-27T19:17:14.293 に答える
2

別のことを知っている (つまり、ファイルをビッグ エンディアン形式で読んでいることを知っている) か、何らかの形でファイルのエンディアンをエンコードする必要があるため、それを推測する必要があります。Unicode テキスト ファイル0xFFFEは、テキスト ファイルの最初の 2 バイト (または同様のもの) を使用して、エンディアンを計算します。0xfffe と読むと、ネイティブ エンディアン形式です。0xfeff と読むと、そうではありません。

于 2009-01-27T19:09:49.410 に答える
1

これがまさにあなたが求めているものであるかどうかはわかりませんが、たとえば、PCAPファイル形式は変数のエンディアンを指定します。

http://www.winpcap.org/ntar/draft/PCAP-DumpFileFormat.html

概念は、0x12345678などの「マーカー」バイトをファイルのヘッダーに書き込むことができるということです。PowerPCなどの「ビッグエンディアン」マシンでは、次のように記述されます。

0x12 0x34 0x56 0x78

x86などの「リトルエンディアン」マシンでは、次のように記述されます。

0x78 0x56 0x34 0x12

次に、ヘッダーを読み取るときに、ファイルの読み取り中にバイトを交換する必要があるかどうかを判断するために、マシンが読み取った内容を確認できます。または、ビッグエンディアンなどのエンディアンを指定することもできます。次に、リトルエンディアンのマシンで常にバイトをスワップインします。

PCAP形式の場合、これはパフォーマンス上の理由から行われました。ただし、エンディアンを指定してそれに固執する方がおそらく簡単です。

于 2009-03-14T18:15:04.480 に答える
1

その通りです...見ているデータについての知識がなければ、知る方法はありません。

そうは言っても、推測する方法はよくあります...テキストが表示されていることがわかっている場合は、いくつかの簡単なテストを実行して、取得したものが妥当かどうかを確認できます...ヘッダーを読むことができれば多くの場合、そこから推測できます...しかし、バイトのストリームを見ているだけでは、確実に知る方法はありません.

于 2009-01-27T19:11:10.467 に答える
1

これは意味がありますか?

はい:問題です。

ここで超基本的な何かが欠けているように感じます。

基本的に、ファイル (特にバイナリ ファイル) を読み取るには、ファイル形式を知る必要があります。これには、バイトのペアが個々のバイトのシーケンスであるか、単一の 2 バイト ワードであるかを知ることが含まれます。

于 2009-01-27T19:13:09.823 に答える
1

あなたは何も見逃していません。適切に定義されたバイナリ ファイル形式 (Excel 97-2003 xls ワークブックなど) には、仕様の一部としてエンディアンを含める必要があります。そうしないと、明らかに大きな問題が発生します。

歴史的に、Macintosh はビッグエンディアンの Motorola プロセッサ (68000 およびその後継) を使用していましたが、IBM PC / DOS / Windows コンピュータは常にリトルエンディアンの Intel プロセッサを使用していました。そのため、両方のプラットフォームで実行される C / C++ コード ベースを持つソフトウェア ベンダーは、この問題に非常に精通しています。一方、Apple が Intel に切り替える前に常に Windows ソフトウェアまたは Mac ソフトウェアを開発してきたソフトウェア ベンダーは、この問題を単に無視していた可能性があります。独自のファイル形式。

于 2009-01-27T19:18:28.207 に答える
0

プロセッサは、いずれかのエンディアン モードで動作します (一部はページなどに基づいて切り替えることができます)。彼らは自分が正しいことをしているかどうかを知りません。彼らはただ彼らがすることをします。(ガベージイン、ガベージアウト) :-)

于 2009-01-27T19:10:53.650 に答える
0

私が言うことを検出する方法はありません。しかし、C# では BitConverter に IsLittleEndian プロパティがあります。

それはすべて、あなたがどのように入力したいかによって異なります。

詳細はこちらをご覧ください

于 2009-01-27T19:11:27.473 に答える