首页 > 编程语言 >Java:commons-codec实现byte数组和16进制字符串转换

Java:commons-codec实现byte数组和16进制字符串转换

时间:2023-09-03 13:07:34浏览次数:46  
标签:Java String 16 Hex commons codec byte



目录

  • commons-codec
  • 实现原理
  • 封装StringUtil 类


commons-codec

文档

坐标

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

byte数组转为16进制字符串

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

16进制字符串转为byte数组

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

完整代码

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
    }
}

实现原理

/**
* 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();
    }
}

封装StringUtil 类

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);
        }
    }
}

参考


标签:Java,String,16,Hex,commons,codec,byte
From: https://blog.51cto.com/mouday/7339471

相关文章

  • javaee spring依赖注入之spel方式
    spring依赖注入之spel方式<dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.3.18.RELEASE</version></dependency>packagecom.test.pojo;im......
  • Java:移位运算符左移运算符<<、右移运算符>>、无符号右移运算符>>>
    目录符号位左移运算符<<右移运算符>>无符号右移运算符>>>其他符号位二进制形式最左边的第一位是符号位0表示正数1表示负数例如十进制:1二进制原码:00000000000000000000000000000001十进制:-1二进制原码:10000000000000000000000000000001左移运算符<<规则:丢弃左边指定位数......
  • Java底层起步
    Java底层起步Java介绍什么是面向对象?例如:小戴正在做饭时,发现没酱油了,对着外面的朋友小张说,小张你去买瓶酱油,然后小张给楼下超市的小王打电话,让送了一瓶酱油上来。在上述的过程中,从面向对象的角度来讲,其强调的是谁来做这个事,而不是这个事的过程。(是以人及结果为导向而不是过程为导......
  • Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: The
    这个错误表明在尝试获取JDBC连接时发生了SQLException,并且该异常表示服务器不识别或不包含一个以上的时区。以下是一些可能的解决方法:确认服务器时区设置:确保你的服务器时区设置正确。你可以在数据库中运行以下查询来检查当前时区设置:sqlSELECT@@全球化设置(‘TzSystem’);如......
  • idea启动项目报错Error:(5, 52) java: 程序包org.springframework.beans.factory.anno
    idea启动项目报错Error:(5,52)java:程序包org.springframework.beans.factory.annotation不存在IDEA启动项目报错ERROR:(5,52)JAVA:程序包ORG.SPRINGFRAMEWORK.BEANS.FACTORY.ANNOTATION不存在去IDEA下查找maven选项:如果还不行,则继续选择下面的runner,勾选deleteIDEbuild......
  • idea配置默认javadoc类、接口注释,自动生成文档
    idea配置类#if(${PACKAGE_NAME}&&${PACKAGE_NAME}!="")package${PACKAGE_NAME};#end#parse("FileHeader.java")/***总体描述*<p>创建时间:${DATE}${TIME}</p>*@authorzhaoXin*@sincev1.0*/publicclass${NAME}{}接......
  • java打war包、jar包方式,java运行war包、jar包方式
    Javaspringboot部署到生产环境有两种常见方式1打jar包,使用了内置的tomcat服务器,流程简单2打war包,可以放标准tomcat服务器中jar包1pom.xml新增<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin......
  • Java使用有限状态机算法实现判断字符串是否合法
    题目描述请根据给出的正则表达式来验证邮箱格式是否合法,如果用户输入的格式合法则输出「邮箱格式合法」,否则输出「邮箱格式不合法」。正确格式对应的正则表达式"[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+";输入:[email protected]输出:邮箱格式合法分析最容易想到的是正则表达......
  • javaee spring 测试aop 切面
    切面类packagecom.test.advice;importorg.aspectj.lang.ProceedingJoinPoint;//增强类publicclassMyAdvice{//将这个增强方法切入到service层的add方法前publicvoidbefore(){System.out.println("添加用户之前");}}目标类packag......
  • javaee spring 静态代理
    静态代理packagecom.test.staticProxy;publicinterfaceIUsersService{publicvoidinsert();}packagecom.test.staticProxy;//目标类publicclassUsersServiceimplementsIUsersService{@Overridepublicvoidinsert(){System.out.print......