将字符串解析为打包的二进制数据,Python与Java
我在用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。