我试图将此代码段从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));
答案 0 :(得分:2)
正如评论中所提到的,在.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清除。