如何将有符号字节数组转换为 Java 中的 ascii

How to convert signed byte array to ascii in Java

在Java程序中 我已将字节数组签名为

[-112, 21, 64, 0, 7, 50, 54, 127]

如何转换成ascii码 等于

901540000732367F

结果中的字节顺序似乎与数组的字节顺序相反,因此您应该以相反的顺序迭代数组并将每个元素按预定义的位数添加:

private static String convertToHexFullByte(byte[] arr) {
    return convertToHex(arr, 8);
}
    
private static String convertToHexHalfByte(byte[] arr) {
    return convertToHex(arr, 4);
}
    
private static String convertToHex(byte[] arr, int bits) {
    long mask = 0;
    for (int i = 0; i < bits; i++) {
        mask |= 1 << i;
    }
    long res = 0;
    for (int i = arr.length - 1, j = 0; i >= 0; i--, j += bits) {
        res |= (arr[i] & mask) << j;
    }

    return Long.toHexString(res).toUpperCase();        
}

测试

public static void main(String args[]) {
    byte[] arr4 = {49, 55, 48, 51, 55};
        
    System.out.println(convertToHexHalfByte(arr4));
        
    byte[] arr8 = {-112, 21, 64, 0, 7, 50, 54, 127};
        
    System.out.println(convertToHexFullByte(arr8));
}

输出

17037
901540000732367F

试试这个。它的工作原理是:

  • 流式传输字节数组的索引
  • 映射到 int 并去掉符号扩展
  • 通过 shift 和 or 操作减少到 long。
byte[] bytes = { -112, 21, 64, 0, 7, 50, 54, 127 };

long lng = IntStream.range(0, bytes.length)
        .mapToLong(i -> bytes[i] & 0xff)
        .reduce(0L, (a, b) -> (a << 8) | b);

System.out.println("long decimal value = " + lng);
System.out.println("long hex value = " + Long.toHexString(lng));    

打印

long decimal value = -8064469188872096129
long hex value = 901540000732367f

使用相同的技术,{49, 55, 48, 51, 55}的另一个示例 应该是:

long decimal value = 211379303223
long hex value = 3137303337