Java: commons-codec implements byte array and hexadecimal string conversion

commons-codec

document

coordinate

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>

Convert byte array to hexadecimal string

String hex = Hex.encodeHexString("123".getBytes());
System.out.println(hex);
// 313233

Convert hexadecimal string to byte array

byte[] src = Hex.decodeHex("313233");
System.out.println(new String(src));
// 123

full code

package com.example.demo;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.junit.Test;

public class TestCodec {
    
    

    @Test
    public void encode(){
    
    
        String hex = Hex.encodeHexString("123".getBytes());
        System.out.println(hex);
        // 313233
    }

    @Test
    public void decode() throws DecoderException {
    
    
        byte[] src = Hex.decodeHex("313233");
        System.out.println(new String(src));
        // 123
    }
}

Realization principle

/**
* Hex类 该类用来对数据处理16进制的转换。
 */
public static class Hex {
    
    

    /*
     * 16进制数字字符集
     */
    private static final char[] HEX = {
    
    
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'a', 'b', 'c', 'd', 'e', 'f'
    };


    public static byte[] decode(CharSequence s) {
    
    
        int nChars = s.length();
        if (nChars % 2 != 0) {
    
    
            throw new IllegalArgumentException("16进制数据错误");
        }
        byte[] result = new byte[nChars / 2];
        for (int i = 0; i < nChars; i += 2) {
    
    
            int msb = Character.digit(s.charAt(i), 16);
            int lsb = Character.digit(s.charAt(i + 1), 16);
            if (msb < 0 || lsb < 0) {
    
    
                throw new IllegalArgumentException(
                        "Detected a Non-hex character at " + (i + 1) + " or " + (i + 2) + " position");
            }
            result[i / 2] = (byte) ((msb << 4) | lsb);
        }
        return result;
    }

    /*
     * 将字符串编码成16进制数字,适用于所有字符(包括中文)
     * 0x表示:16进制
     */
    public static String encode(byte[] buf) {
    
    
        StringBuilder sb = new StringBuilder();
        for (int i = 0, length = buf.length; i < length; i++) {
    
    
            // 高4位
            // 0xF0 1111 0000
            // 97=> 0110 0001
            //  &=> 0110 0000
            // >>> 4 =>0000 0110 == 6
            // =HEX[6] = 6

            // 低4位
            // 0x0F 0000 1111
            // 97=> 0110 0001
            // & => 0000 0001 == 1
            // =HEX[1] = 1

            sb.append(HEX[(buf[i] & 0xF0) >>> 4])
                    .append(HEX[buf[i] & 0x0F]); // 0x 0000 1111
        }
        return sb.toString();
    }
}

Encapsulate the StringUtil class

package com.example.demo.utils;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;

public class StringUtil {
    
    
    /**
     * 字符串转16进制
     * @param data
     * @return
     */
    public static String stringToHex(String data) {
    
    
        return Hex.encodeHexString(data.getBytes());
    }

    /**
     * 16进制转字符串
     * @param hex
     * @return
     */
    public static String hexToString(String hex) {
    
    
        try {
    
    
            return new String(Hex.decodeHex(hex));
        } catch (DecoderException e) {
    
    
            throw new RuntimeException(e);
        }
    }
}

reference

Guess you like

Origin blog.csdn.net/mouday/article/details/132542063