/** * 将AB1234形式的16进制字符串转换为10进制数值,考虑字节序的影响. * * @param hexStr * "AB1234"形式的16进制字符串 * @param byteOrder * 字节序 * @return 10进制数值 */ public static long ConvertHexStrToDec(String hexStr, ByteOrder byteOrder) {
// 如果是大端字节序,直接解析返回(Java默认使用大端字节序) if (byteOrder.equals(ByteOrder.BIG_ENDIAN)) { return Long.parseLong(hexStr, 16); }
// 先按大端字节序解析16进制字符串。 Long wrongNumber = Long.parseLong(hexStr, 16);
// 将数值写入ByteBuffer,得到字节流 ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE); buffer.order(ByteOrder.BIG_ENDIAN); buffer.putLong(wrongNumber); byte[] array = buffer.array();
// 得到第一个值不为0的数组下标 int beginIndex = 0; for (int i = 0; i < array.length; i++) { if (array[i] != 0) { beginIndex = i; break; } }
// 剩余字节,反序写入另一个数组中,靠尾端写入 byte[] newArray = new byte[array.length]; int nextPositon = newArray.length - 1; for (int i = beginIndex; i < array.length; i++) { newArray[nextPositon] = array[i]; nextPositon--; }
// 复制回原数组(ByteBuffer直接受影响) System.arraycopy(newArray, 0, array, 0, newArray.length);
// 按Long型读出。 buffer.rewind(); return buffer.getLong(); }
|