Интерпретировать строки как упакованные двоичные данные, Python против Java - PullRequest
1 голос
/ 13 февраля 2011

Я немного борюсь с двоичным в Java и Python, чтобы перевести программу

В Python, когда я выполняю следующие команды, я получаю

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

>>> print ord(pack('>H', 32809)[1])
41

В Java я ожидаю получить тот же результат при выполнении следующей команды, но ее там нет:

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

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

Может кто-нибудь объяснить мне, почему 128 отрицательно в Java? Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 13 февраля 2011

Байт в java - это подписанный тип данных - и да, я так и не понял, почему они это сделали. Вам нужно будет использовать короткий (так как все битовые операции в любом случае используются в целых числах, просто используйте int на самом деле) и игнорировать старшие 8 бит (в противном случае расширение знака будет проблемой)

 System.out.println(((short) ((32809 & 0xFF00) >> 8)) & 0xFF);
1 голос
/ 13 февраля 2011

Байт со знаком имеет диапазон -128..127, поэтому (127 + 1) == -128

0 голосов
/ 13 февраля 2011

У вас не будет неподписанных типов в Java. Вы можете вместо этого привести его к короткому или целому.

...