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