如何在Java中将带符号的字节数组转换为ASCII

问题描述

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

[-112,21,64,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,7,50,54,127};
        
    System.out.println(convertToHexFullByte(arr8));
}

输出

17037
901540000732367F
,

尝试一下。它的工作原理是:

  • 流式传输字节数组的索引
  • 映射到int并摆脱符号扩展名
  • 通过班次和或工序减少很多。
byte[] bytes = { -112,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}的另一个示例 应该是:

long decimal value = 211379303223
long hex value = 3137303337

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...