如何从 jmrtd 的 sendGetChallenge 返回的字节数组中获取 long(用于获取护照随机数)

How to get long from byte array returned by jmrtd's sendGetChallenge (used to get passport random number)

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

第一步是向护照发送质询,以便它以字节数组(8 字节)形式的随机 64 位数字进行响应。

函数sendGetChallenge returns一个字节数组。

我需要将这个字节数组打印成一个数字来进行分析,但是我在将返回的字节数组转换为long时遇到了问题,主要是因为我不确定这个数组是大端还是小端。

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

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;
}

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();

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

谁能帮我解决为什么我会得到负值,或者谁知道如何从 jmrtd 库的 sendGetChallenge 函数返回的字节数组中获取长值。

谢谢。

这个否定没有错。发生的事情是 long 是一个带符号的数字,所以如果你的字节数组的第一位是 1 它将把整个数字变成负数。它持有正确的价值,但它会显示为负数。解决方案是要么处理它,要么不使用 long(使用 BigInteger 或 String)。