JAVA中byte数组以十六进制字符串打印及十六进制字符串转换为字节数组

时间:2025-01-28 07:19:28

在处理底层报文时,经常会遇到把byte数组打印到控制台或日志,查看转换的数组是否正确。也会遇到把十六进制字符串转换为字节数组,以下对两种场景进行转换处理。

1.将指定byte数组以十六进制的形式打印

//方法一:调用()方法,把每一个字节转换成字符串

public void BytePrintAsString(byte [] byteArray) {        
        for (int i = 0; i < ; i++) {
            String hex = (byteArray[i] & 0xFF);
            if (() == 1) {
                hex = '0' + hex;
            }
            (());
        }
        ();        
    }

参考:/thanq/article/details/83355863

//方法二:通过把一个字节转成int值,int值再转十六进制。最后,通过for循环打印整个字节数组。

//一个字节以十六进制字符串展示,如0x43,打印结果43,非67(0x43对应int值)。

 public  String toHexString(byte b){
        String str  = "";
        int value = b;
        int remainder = 0;//余数
        if(value == 0){//处理字节0x00
            str = "00";
        }else if(value < 0){

//处理字节0xA0-0xFF,直接打印是最高位-1数字的补码,如字节0xA5,直接打印结果为-91
            value = value + 256;
        }
        while(value != 0){//处理字节0x01-0x9F
            remainder = value % 16;
            if(remainder < 10){
                str = (remainder) + str;
            }else{
                switch (remainder) {
                    case 10:
                        str = 'A' + str;
                        break;
                    case 11:
                        str = 'B' + str;
                        break;
                    case 12:
                        str = 'C' + str;
                        break;
                    case 13:
                        str = 'D' + str;
                        break;
                    case 14:
                        str = 'E' + str;
                        break;
                    case 15:
                        str = 'F' + str;
                        break;
                }
            }
            value = value/16;
        }
        if(() < 2){//处理值在0-15的一个字节
            return '0' + str;
        }
        return str;
    }

2.十六进制字符串转字节数组

public void HexStringToByteArray(String byteStr) {
        char [] charArray =();
        byte [] byteArrayNew = new byte[/2];
        int high = 0;//十六进制一个字节,高4位
        int low = 0;//十六进制一个字节,低4位
                      
        for(int i=0;i<;i+=2) {
              //high
              if(charArray[i]>='1' && charArray[i]<='9')
              {
                  high = charArray[i]-'0';        
              }else if(charArray[i]>='A' && charArray[i]<='F')
              {
                  high = charArray[i]-'A'+10;
              }else if(charArray[i]>='a' && charArray[i]<='f')
              {
                  high = charArray[i]-'a'+10;
              }
              //low
              if(charArray[i+1]>='1' && charArray[i+1]<='9')
              {
                  low = charArray[i+1]-'0';        
              }else if(charArray[i+1]>='A' && charArray[i+1]<='F')
              {
                  low = charArray[i+1]-'A'+10;
              }else if(charArray[i+1]>='a' && charArray[i+1]<='f')
              {
                  low = charArray[i+1]-'a'+10;
              }
            byteArrayNew[i/2] =(byte) (high*16+low);
        }
        
        for (int i = 0; i < ; i++) {
            String hex = (byteArrayNew[i] & 0xFF);
            if (() == 1) {
                hex = '0' + hex;
            }
            (() );
        }
    }

3.转换测试

    public static void main(String[] args) {

        //上面方法自行封装类
        StringAndByteArraySwitch switchObj = new StringAndByteArraySwitch();
        byte [] byteArray = {0x01,0x03,0x00,0x04,0x00,0x02,(byte)0x85,(byte)0xca};
        (byteArray);
        //01030004000285CA


        String byteStr = "01030004000285CA";
        (byteStr);

        //01030004000285CA
    }

希望对遇到相关问题的小伙伴有帮助,写的不好请大家担待如有更好的方法,或者建议请评论区留言,大家一起讨论,谢谢~