Java は整数をリトル エンディアンまたはビッグ エンディアンで読み取りますか?

StackOverflow https://stackoverflow.com/questions/362384

  •  21-08-2019
  •  | 
  •  

質問

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

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

追加の質問:Java 側のエンディアンが送信されたエンディアンと異なる場合、どうすれば両者の間で変換できますか?

役に立ちましたか?

解決

Javaはとにかく使用するのと同じであるネットワークバイトオーダー(ビッグエンディアン)で、使用してください。 C内の異なる翻訳者のためのマニュアルを参照してくださいhtonsます。

他のヒント

私はグーグルを経由して、ここでつまずいとJavaはビッグエンディアンである私の答えを得ています。

あなただけの「主流」のマイクロプロセッサを扱ってきたならば幸い、あなたが持っている可能性は低いですが、私は、バイトが実際にエンディアン順序を持っているかということを指摘したいと思い応答を通して読むには、これまでインテル、モトローラ、としてそれに遭遇しましたそして、ザイログは、すべてのUARTチップのシフト方向で合意し、バイトのMSBが2 ** 7とLSB(私はこのようなものがどのように古い強調するために、FORTRANの電力表記を自分のCPUで2 ** 0使用されるであろうと。 ))。

私はいくつかのスペースシャトルでこの問題に遭遇したが、シリアルダウンリンクデータをビット20+年前、私たちは、Macコンピュータと$ 10Kのインタフェースハードウェアを交換したとき。ずっと前にそれについて公表NASAテック・ブリーフがあります。私は単に256の要素は、各バイトは、ビットストリームからシフトされた後(表[0×01] = 0x80を等)反転ビットとルックアップテーブルを使用する。

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

  

各バイトは、開始時LSB TNEたC側では端部で、左及びMSBである。

使用しているように、

これが聞こえるLSB最下位ビットとして、あなたはありますか? LSB通常、最下位バイトを表します。 エンディアンのビット基づいていますが、バイトは基づいていません。

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

int i = (int) b & 0xFF;

Javaのlong(私の頭の上から、テストされていない)に[]バイトで符号なし32ビットリトルエンディアンから変換するには:

long l = (long)b[0] & 0xFF;
l += ((long)b[1] & 0xFF) << 8;
l += ((long)b[2] & 0xFF) << 16;
l += ((long)b[3] & 0xFF) << 24;

直接のJavaのintにいくつかのバイトをマッピングする(直接非API)方法はありませんので、これは、Javaで何も影響を与えることができる方法はありません。

あなたがそのAPIのドキュメントを調べる必要がありますので、

このまたは類似した何かをすべてのAPIは、かなり正確に動作を定義します。

バイトを 1 つずつ読み取って、それらを 1 つに結合します。 長さ 価値。そうすることでエンディアンを制御でき、通信プロセスが透過的になります。

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

上述のように

Javaは「ビッグエンディアン」です。それはあなたが(少なくともインテルCPU上で)メモリを調べる場合はint型のMSBが左側にあることを意味します。符号ビットは、すべてのJava整数型用のMSBでもあります。
「リトルエンディアン」システムによって格納されたバイナリ・ファイルから4バイトの符号なし整数を読み取ると、Javaにおける適応のビットを取ります。 DataInputStreamの者のreadInt()はビッグエンディアン形式を期待しています。
ここで1の値を有する整数に(01 00 00 00のようHEXEDITによって表示される)は、4バイトの符号なし値を読み出す例を示します。

 // Declare an array of 4 shorts to hold the four unsigned bytes
 short[] tempShort = new short[4];
 for (int b = 0; b < 4; b++) {
    tempShort[b] = (short)dIStream.readUnsignedByte();           
 }
 int curVal = convToInt(tempShort);

 // Pass an array of four shorts which convert from LSB first 
 public int convToInt(short[] sb)
 {
   int answer = sb[0];
   answer += sb[1] << 8;
   answer += sb[2] << 16;
   answer += sb[3] << 24;
   return answer;        
 }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top