Java 如何从jmrtd';s sendGetChallenge(用于获取passport随机数)

Java 如何从jmrtd';s sendGetChallenge(用于获取passport随机数),java,android,arrays,byte,long-integer,Java,Android,Arrays,Byte,Long Integer,我正在使用android上的jmrtd库来获取和处理护照信息 第一步是向passport发送质询,使其以随机64位数字作为字节数组(8字节)进行响应 函数sendGetChallenge返回一个字节数组 我需要将这个字节数组作为一个数字打印出来进行分析,但是我在将返回的字节数组转换为long时遇到了问题,主要是因为我不确定这个数组是big-endian还是little-endian 到目前为止,我使用了以下方法: public static long byteArrayToLong(byte[]

我正在使用android上的jmrtd库来获取和处理护照信息

第一步是向passport发送质询,使其以随机64位数字作为字节数组(8字节)进行响应

函数sendGetChallenge返回一个字节数组

我需要将这个字节数组作为一个数字打印出来进行分析,但是我在将返回的字节数组转换为long时遇到了问题,主要是因为我不确定这个数组是big-endian还是little-endian

到目前为止,我使用了以下方法:

public static long byteArrayToLong(byte[] bytes){
    long value = 0;
    value += (long) (bytes[7] & 0x000000FF) << 56;
    value += (long) (bytes[6] & 0x000000FF) << 48;
    value += (long) (bytes[5] & 0x000000FF) << 40;
    value += (long) (bytes[4] & 0x000000FF) << 32;
    value += (bytes[3] & 0x000000FF) << 24;
    value += (bytes[2] & 0x000000FF) << 16;
    value += (bytes[1] & 0x000000FF) << 8;
    value += (bytes[0] & 0x000000FF);
    return value;
}

但我得到(有时)负值,这显然是错误的

有人能帮我解释一下为什么我会得到负值,或者如果有人知道如何从jmrtd库的sendGetChallenge函数返回的字节数组中获取长值


谢谢。

那张底片没有错。现在的情况是long是一个有符号的数字,所以如果字节数组的第一位是1,那么整个数字就会变成负数。它保持正确的值,但它将显示为负数。解决方法是要么处理它,要么不使用long(使用BigInteger或字符串)。

谢谢您的回复。问题是,数字不能是负数,所以我可以停止使用long,但我使用了biginger,仍然得到了负数。biginger也是有符号的。如果要使用BigInteger,则需要确保MSB不是1。最简单的方法是将0作为字节数组中的第一个字节传入,然后再传入后面的数据?我的意思是,我得到一个8位字节数组作为函数的响应,所以我应该“插入”一个0作为第一个字节吗?如果这是正确的,应该是0还是8?再次感谢。是的,在第一个位置插入0。BigInteger假设数组是按网络字节顺序(big-endian)排列的,因此最高有效位是第一位。强制该MSB为0将强制该数字为正数。如果MSB为负数,则整个数字将被视为2的补码负数。我这样做了,在一次测试中,我得到了这个数字15761629304742585754。对于一个可能的64位数字,我能得到的最大数字是(2^64)-1,对吗?我的意思是,在我的情况下,我是用一个未签名的值工作的,对吗?
private long byteArrayToLong(byte[] buffer){
    long value=0;
    long multiplier=1;
    for (int i = 7; i >= 0; i--) { //get from the right
        value=value+(buffer[i] & 0xff)*multiplier; 
        multiplier=multiplier <<8;
    }
    return value;
}
public static long bytesToLong(byte[] bytes) {
    ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE);
    buffer.put(bytes);
    buffer.flip();
    return buffer.getLong();
}
byte[] randomNumber = sendGetChallenge();    
new BigInteger(randomNumber).toString();