2011-02-13 14 views
1

対私は、次のコマンドを実行したときに、私はがパックされたバイナリデータとして文字列を解釈し、Pythonのは、Java

>>> print ord(pack('>H', 32809)[0]) 
128 

>>> print ord(pack('>H', 32809)[1]) 
41 
を持っているPythonでプログラム

を翻訳するには、JavaやPythonでバイナリで少し苦労していますJavaでは

、私は次のコマンドを実行したときに同じ結果を持っていることを期待しますが、それはありません:128はJavaで負である理由

bsh % print ((byte)((32809 & 0xFF00) >> 8)); 
-128 

bsh % print ((byte)(32809 & 0x00FF)); 
41 

誰かが私に説明できますか? 多くのありがとうございます。

答えて

1

Aはバイトは-128..127の範囲を持っているので、(127 + 1)

+0

これは(バイト)128 = -128を意味しますか? – art1go

+0

はい。 127からのインクリメントは "ラップアラウンド" - 127のビットパターンは0x7Fです。 1つ追加すると0x80となります。符号付きバイトとして解釈されますが、これは-128です。 +128を正しく表すために、符号付きバイトに十分なビットがありません。 –

2

Javaのバイトは署名されたデータ型です - そして、私はなぜ彼らがそれをしたのか理解できませんでした。 「あなたは勝った

System.out.println(((short) ((32809 & 0xFF00) >> 8)) & 0xFF); 
+4

または== -128だけ'のSystem.out.println((32809 >> 8)&0xFFで)署名しました –

0

(そうでない問題だろう拡張子サイン)あなたは(すべてのビットOPSがとにかくint型に使用されてもいるので、本当にint型を使用します)、短いを使用し、高い8ビットを無視する必要がありますJavaでは符号なしの型を持っています。代わりに、shortまたはintにキャストすることを検討できます。 `;

+0

BTW 'char'は符号なし型です。 ;) –

+0

それは本当です、そうです。しかし、数字に関しては、符号なしの型はありません。はい、私はそれが 'char c = 100;'と言うのは正しいことを知っていますが、java.lang.CharacterがNumberをどのように拡張しないか見ると、それは数値ではないと考えられます。 – corsiKa

関連する問題