将字符串解析为打包的二进制数据,Python与Java

1 投票
3 回答
1315 浏览
提问于 2025-04-16 11:45

我在用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

有人能告诉我为什么在Java中128是负数吗?非常感谢。

3 个回答

0

在Java中是没有无符号类型的。你可以考虑把它转换成短整型(short)或者整型(int)。

2

在Java中,byte是一种有符号的数据类型——我也一直搞不懂他们为什么要这样设计。你需要使用short类型(其实因为所有的位操作都是在int上进行的,所以直接用int就好了),然后忽略高8位(否则会出现符号扩展的问题)。

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

一个带符号的字节可以表示的数值范围是从-128到127,所以当你把127加1时,结果会变成-128。

撰写回答