2011-02-13 5 views
1

대 나는 다음과 같은 명령을 실행 파이썬에서, 내가있어파이썬은 자바

프로그램을 번역하는 자바와 파이썬에서 바이너리와 조금 사투를 벌인거야, 포장 이진 데이터로 문자열을 해석

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

>>> print ord(pack('>H', 32809)[1]) 
41 
자바에서

는, 나는 다음과 같은 명령을 실행할 때와 동일한 결과를 기대하지만, 거기이다 : (128) 자바에 부정적인 이유

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입니다. 하나를 추가하면 0x80이됩니다. 부호 첨부 byte로서 해석되는 경우, -128 +128을 올바르게 나타 내기 위해 부호있는 바이트에 충분한 비트가 없습니다. –

2

자바의 바이트는 서명 된 데이터 유형입니다. 그렇기 때문에 왜 그렇게했는지 이해하지 못했습니다. '당신은 원

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

아니면 그냥 == -128 '에서 System.out.println ((32809 >> 8)은 0xFF) 서명 –

0

(그렇지 않으면 문제가 될 것이다 연장에 서명) 당신은 (모든 비트 작전은 어쨌든의 int에 사용되는 잘 때문에, 정말 정수 (int)를 사용) 짧은을 사용하고 높은 8 비트를 무시해야합니다 Java에서 부호없는 유형이 있습니다. 대신 짧은 또는 int로 캐스팅을 고려할 수 있습니다. `;

+0

BTW'char'는 부호없는 타입입니다. ;) –

+0

사실입니다. 그러나 숫자에 관한 한 부호없는 유형은 없습니다. 예,'char c = 100;이라고 말하는 것이 타당하지만 java.lang.Character가 Number를 확장하지 않는 것을 볼 때, 저는 그것을 숫자로 생각하지 않습니다. – corsiKa