我正在尝试将此代码段从C#转换为Java。 C#代码段正确返回值3259945
,Java代码错误返回-16855
。我对位操作完全没用,甚至不知道从哪里开始。有人可以帮忙吗?
如果人们需要输入变量,我将尝试以十六进制字符串的形式获取缓冲区字节数组,这样我就可以提出它了。我正在使用的startIndex
是26
。
C#代码段:
Int64 mantissa = ((Int64)(buffer[startIndex] & 0x7F) << (8 * 2))
| ((Int64)buffer[startIndex + 3] << (8 * 1))
| ((Int64)buffer[startIndex + 2] << (8 * 0));
Java代码段:
long mantissa = ((long)(buffer[startIndex] & 0x7F) << (8 * 2))
| ((long)buffer[startIndex + 3] << (8 * 1))
| ((long)buffer[startIndex + 2] << (8 * 0));
最佳答案
如注释中所述,.NET中的字节是无符号的(0到255),而Java中的字节是无符号的(-128到127)。要对其进行规范化,您需要使用& 0xFF
掩码。
long mantissa = ((long)(buffer[startIndex] & 0x7F) << (8 * 2))
| ((long)(buffer[startIndex + 3] & 0xFF) << (8 * 1))
| ((long)(buffer[startIndex + 2] & 0xFF) << (8 * 0));
在第一种情况下,您不需要此掩码,因为符号位已被0x7F清除。