Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的unsigned long,在算术中使用biginger,但biginger.toByteArray返回14字节而不是8字节_Java_Long Integer_Unsigned - Fatal编程技术网

java中的unsigned long,在算术中使用biginger,但biginger.toByteArray返回14字节而不是8字节

java中的unsigned long,在算术中使用biginger,但biginger.toByteArray返回14字节而不是8字节,java,long-integer,unsigned,Java,Long Integer,Unsigned,我有下面的c代码,我想把它移植到Java unsigned long long* data=(unsigned long long*)pBuffer; // file data unsigned long long crypt = 0x0000; unsigned long long next_crypt; unsigned int len = size >> 3; for(unsigned int i=0; i<len;i++) { next_crypt =

我有下面的c代码,我想把它移植到Java

unsigned long long* data=(unsigned long long*)pBuffer; // file data
unsigned long long crypt = 0x0000;
unsigned long long next_crypt;
unsigned int len = size >> 3;

for(unsigned int i=0; i<len;i++) {
        next_crypt = crypt+data[i]-0xCAFEBABE;      
        data[i] = ((data[i]<<0x1d)|(data[i]>>0x23))+0xCAFEBABE;
        data[i] =  (data[i]<<0x0e)|(data[i]>>0x32);
        data[i] = data[i] - crypt;
        crypt = next_crypt;     

    }
unsigned long long*数据=(unsigned long*)pBuffer;//文件数据
无符号长密码=0x0000;
未签名的长下一个加密;
无符号整数长度=大小>>3;

对于(unsigned int i=0;i您的C代码依赖于从
unsigned long long
的高阶端移位的位(这些位通过另一个移位旋转到另一端)。BigInteger是任意精度,因此没有端点,因此左移位的位永远不会移位

你可以构造一个64位的BigInteger按位AND掩码,然后在左移位后进行运算。这是一个直观的解决方案

您也可以简单地忽略高阶字节

byte[] bar = foo.toByteArray();
if (bar.length > 8) {
    bar = System.arrayCopy(bar, bar.length - 8, new byte[8], 0, 8);
}
如果
len
很大,那么这个简单的解决方案将浪费内存

在任何情况下,都有一个更理智、更高性能的解决方案。Java的有符号整数类型都保证有2的补码语义。具有2的补码整数和无符号整数的算术的位语义是相同的——区别只是在值的解释上!所以只需使用原始C代码(替换为Java的
long
),最后,按照您的方式解释它们


顺便说一句,一定要用Java的
>>
操作符替换C代码中的
>
操作符。

Java的好处是它保证是两个补码,所以如果使用>>>而不是>>并避免%和/和不等式,那么算术实际上是无符号的。

这是一个无符号长-8字节!如果您不向我们展示Java版本,您希望如何得到答案?非常感谢,这解决了我的问题-我不知道“>>>”-这确实解决了我的问题。正如我所说,我以前有负的long值,但使用无符号右移运算符,它运行得很好。顺便问一下,你的longToByteArray与ByteBuffer b=ByteBuffer.allocate(8);b.putLong(longValue);b.array()?@Steve,它们是一样的(因为默认情况下ByteBuffer是big-endian).我不知道那个方案,肯定用它来代替。谢谢你,就像其他海报一样,解决了我的问题!
byte[] longToByteArray(long x) {
    byte[] array = new byte[8];
    for (int i = 7; i >= 0; i--) {
        array[i] = (byte)x;
        x >>>= 8;
    }
}