将代码从C#转换为Java位操作,将Int64转换为long

将代码从C#转换为Java位操作,将Int64转换为long,java,c#,bit-manipulation,Java,C#,Bit Manipulation,我正在尝试将这段代码从C#转换为java。C#代码段正确返回值3259945,java代码错误返回值-16855。我完全不擅长比特操作,甚至不知道从哪里开始。有人能帮忙吗 如果人们需要输入变量,我会尝试以十六进制字符串的形式获取缓冲区字节数组,这样我就可以把它放上去。我使用的startIndex是26 C#代码片段: Int64尾数=((Int64)(buffer[startIndex]&0x7F)如注释中所述,在.NET中一个字节是无符号的(0到255),在Java中是有符号的(-128到12

我正在尝试将这段代码从C#转换为java。C#代码段正确返回值
3259945
,java代码错误返回值
-16855
。我完全不擅长比特操作,甚至不知道从哪里开始。有人能帮忙吗

如果人们需要输入变量,我会尝试以十六进制字符串的形式获取缓冲区字节数组,这样我就可以把它放上去。我使用的
startIndex
26

C#代码片段:


Int64尾数=((Int64)(buffer[startIndex]&0x7F)如注释中所述,在.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));

long尾数=((long)(buffer[startIndex]&0x7F)在C#示例中,您是否尝试使用
long
而不是
Int64
?我猜
buffer
字节[]
?注意Java中的字节是signed@DFord
Int64
long
Int64
是实际的结构名,
long
只是一个别名。@Aominè我知道它们是一样的,应该编译相同的,但基于代码,这是我第一次想到尝试。
startIndex是26
,而不知道缓冲区中的内容时,此代码无法运行。当您获得结果时,是否可以提供缓冲区[startIndex]
缓冲区[startIndex+3]
、和
缓冲区[startIndex+2]
?而不是
((缓冲区[startIndex]&0xFF)&0x7F)
,只需
(缓冲区需要[startIndex]&0x7F)
,因为符号位已被0x7F清除
long mantissa = ((long)(buffer[startIndex] & 0x7F) << (8 * 2))
                | ((long)buffer[startIndex + 3] << (8 * 1))
                | ((long)buffer[startIndex + 2] << (8 * 0));
long mantissa = ((long)(buffer[startIndex] & 0x7F) << (8 * 2))
            | ((long)(buffer[startIndex + 3] & 0xFF) << (8 * 1))
            | ((long)(buffer[startIndex + 2] & 0xFF) << (8 * 0));