将代码从C#转换为Java位操作,将Int64转换为long
我正在尝试将这段代码从C#转换为java。C#代码段正确返回值将代码从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
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@DFordInt64
是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));