java中的二进制数据操作

java中的二进制数据操作,java,binary-data,Java,Binary Data,我花了一天的大部分时间追踪一个二进制重建错误,并想了解原因: 特定的代码行如下所示(dataBuffer是一个字节数组): short data=(short)((short)dataBuffer[curPos+3]它是符号扩展。Java中的所有byte值都是有符号的,因此任何大于127的字节值实际上都是负数。因此,字节值,比如0x90(=144十进制)当它是字节时,实际上被视为-112。当它被加宽为短时,它变为0xff90(仍然是-112)。您需要用0xff屏蔽该值以恢复所需的0x0090位模

我花了一天的大部分时间追踪一个二进制重建错误,并想了解原因:

特定的代码行如下所示(
dataBuffer
是一个字节数组):


short data=(short)((short)dataBuffer[curPos+3]它是符号扩展。Java中的所有
byte
值都是有符号的,因此任何大于127的字节值实际上都是负数。因此,字节值,比如0x90(=144十进制)当它是
字节时,实际上被视为-112。当它被加宽为
短时,它变为0xff90(仍然是-112)。您需要用0xff屏蔽该值以恢复所需的
0x0090
位模式

另一方面,您可以从第二个表达式中删除几个强制类型转换:

short data = (short) ((dataBuffer[curPos + 3] << 8) | (dataBuffer[curPos + 2] & 0xff));

short data=(short)((dataBuffer[curPos+3]它是符号扩展。Java中的所有
byte
值都是有符号的,因此任何大于127的字节值实际上都是负数。因此,一个字节值,比如0x90(=144十进制)当它是
字节时,实际上被视为-112。当它被加宽为
短时,它变为0xff90(仍然是-112)。您需要用0xff屏蔽该值以恢复所需的
0x0090
位模式

另一方面,您可以从第二个表达式中删除几个强制类型转换:

short data = (short) ((dataBuffer[curPos + 3] << 8) | (dataBuffer[curPos + 2] & 0xff));

short data=(short)((数据缓冲[curPos+3]字节的符号位需要重置?字节的符号位需要重置?但是删除位7会丢失原始值,不?叹气正常,这是有意义的。@Aubin-删除位7在哪里?但是删除位7会丢失原始值,不?叹气正常,这是有意义的。@Aubin-删除位7在哪里?
short data = (short) ((dataBuffer[curPos + 3] << 8) | (dataBuffer[curPos + 2] & 0xff));