98

CプロセスからJavaにバイトストリームを送信しているのでお願いします。C 側では、32 ビット整数の LSB が最初のバイトで、MSB が 4 番目のバイトです。

私の質問は次のとおりです。C プロセスから送信されたバイトを読み取るときの Java 側では、Java 側のエンディアンとは何ですか?

フォローアップの質問: Java 側のエンディアンが送信されたものと同じでない場合、どうすればそれらの間で変換できますか?

4

9 に答える 9

67

とにかく Java が使用するのと同じネットワーク バイト オーダー (ビッグ エンディアン) を使用します。C のさまざまなトランスレータについては、man htons を参照してください。

于 2008-12-12T10:36:30.603 に答える
54

私はここでGoogleを介してつまずき、Javaはビッグエンディアンであるという答えを得ました。

応答を読んで、バイトには確かにエンディアンの順序があることを指摘したいと思いますが、慈悲深いことに、「主流」のマイクロプロセッサのみを扱ったことがあれば、Intel、Motorola、およびZilogのすべてとしてこれに遭遇したことはないでしょう。 UARTチップのシフト方向と、バイトのMSBがCPU2**7にあり、LSBが2**0CPUにあることに同意しました(FORTRANの電力表記を使用して、このようなものがどれくらい古いかを強調しました:))。

20年以上前に$10,000のインターフェイスハードウェアをMacコンピューターに交換したときに、スペースシャトルビットのシリアルダウンリンクデータでこの問題が発生しました。それについてずっと前に公開されたNASATechの概要があります。table[0x01]=0x80各バイトがビットストリームからシフトインされた後、ビットが逆になっている(など)256要素のルックアップテーブルを使用しただけです。

于 2011-12-08T13:52:50.770 に答える
20

Java には符号なし整数はありません。すべての整数は符号付きで、ビッグ エンディアンです。

C 側では、各バイトの最初に LSB が左側にあり、MSB が最後にあります。

LSB を最下位ビットとして使用しているようですね。LSB は通常、最下位バイトを表します。 エンディアンはビットベースではなく、バイトベースです。

符号なしバイトからJava整数に変換するには:

int i = (int) b & 0xFF;

byte[] の符号なし 32 ビット リトルエンディアンから Java long に変換するには (頭のてっぺんから、テストされていません):

long l = (long)b[0] & 0xFF;
l += ((long)b[1] & 0xFF) << 8;
l += ((long)b[2] & 0xFF) << 16;
l += ((long)b[3] & 0xFF) << 24;
于 2008-12-12T10:23:06.683 に答える
12

一部のバイトをJavaのintに直接マップする(直接の非API)方法がないため、これがJavaの何かに影響を与える可能性はありません。

これまたは同様のことを行うすべてのAPIは、動作を非常に正確に定義するため、そのAPIのドキュメントを調べる必要があります。

于 2008-12-12T21:37:19.340 に答える
3

バイトを 1 つずつ読み取り、それらをlong値に結合します。そうすれば、エンディアンを制御でき、通信プロセスは透過的になります。

于 2008-12-12T10:27:07.393 に答える
2

使用するプロトコルに適合する場合は、動作が非常に明確に定義されているDataInputStreamの使用を検討してください。

于 2008-12-12T11:06:48.717 に答える