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

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

时间:2023-09-01 16:37:11浏览次数:40  
标签:Java String 16 Hex commons codec byte

(目录)

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/7324122

相关文章

  • AP51656 PWM和线性调光 LED车灯电源驱动IC 兼容替代PT4115 PT4205
    产品描述AP51656是一款连续电感电流导通模式的降压恒流源用于驱动一颗或多颗串联LED输入电压范围从5V到60V,输出电流可达1.5A。根据不同的输入电压和外部器件,可以驱动高达数十瓦的LED。内置功率开关,采用高端电流采样设置LED平均电流,通过DIM引脚可以接受模拟调光和很宽范围......
  • LatexEasy | JavaScript集成公式编辑器
    在线示例https://latexeasy.com/en/demo/sdk使用方式基础使用方式<iframeid="liveEditor"frameborder="0"style="width:100%;height:400px;border:0;outline:none;"src="https://latexeasy.com/editor"></if......
  • 让Kubernetes如虎添翼的16个工具
    在DevOps生态系统中,拥有出色的DevOps工具来减轻人为操作非常重要。每个DevOps阶段都可以使用大量的DevOps工具。如果您在DevOps领域中工作并在容器中运行应用程序,那么Kubernetes是必备工具之一。有数百种工具可与Kubernetes配合使用以添加更多功能。我说的是用于更好......
  • Java之关闭进程端口
    我们运行Java程序,经常会遇到端口号被占用的情况。关闭的命令如下:1.查找进程号(如查找8903端口对应的进程号)netstat-ano|findstr89032.根据进程号杀掉端口(如杀掉进程号为42988的进程)taskkill/f/pid42988执行效果如下图 ......
  • Java 迪杰斯特拉 算法实现
    在这里记录下自己写的迪杰斯特拉代码。思路本质是贪心算法:开始时设定两个集合:S,T;S存入已经遍历的点,T存所有未遍历的点;首先将起点放入S中,更新T中所有节点的权重(和起点联通的节点更新权重,其他节点权重设为无穷大);在T中寻找权重最低的点(假设是M点),将M点放入S中,同时更新T里所有节......
  • Java是一种广泛使用的面向对象编程语言
    Java是一种广泛使用的面向对象编程语言,具有以下特性:平台无关性:Java语言编写的程序可以在不同的操作系统和硬件平台上运行,因为Java语言通过Java虚拟机(JVM)实现了平台无关性。面向对象:Java是一种完全面向对象的编程语言,支持封装、继承和多态等面向对象的基本特性。强类型语言:Java是一......
  • Java Swing查看字体和设置全局字体
    查看支持的字体以下代码用于运行时在控制台打印支持的字体GraphicsEnvironmentgEnv=GraphicsEnvironment.getLocalGraphicsEnvironment();finalStringAvailableFontFamilyNames[]=gEnv.getAvailableFontFamilyNames();Stream.of(AvailableFontFamilyNames).forEach(Sys......
  • 微服务16:微服务治理之熔断、限流
    ★微服务系列微服务1:微服务及其演进史微服务2:微服务全景架构微服务3:微服务拆分策略微服务4:服务注册与发现微服务5:服务注册与发现(实践篇)微服务6:通信之网关微服务7:通信之RPC微服务8:通信之RPC实践篇(附源码)微服务9:服务治理来保证高可用微服务10:系统服务熔断、限流微服务11......
  • 基于JavaWeb的科技创新管理系统的设计与实现-计算机毕业设计源码+LW文档
    选题意义: 现代企业越来越重视管理观念的改变,并随着信息化技术的发展,企业信息化程度逐渐提高,许多企业使用管理系统来提高管理效率,比如企业的OA办公管理,通过系统实现员工工作流程的管理以及各项事宜系统化管理。对企业的产品管理方面,使用产品采购管理系统、产品销售管理系统和产品......
  • Java并发编程:volatile关键字解析
    Java并发编程:volatile关键字解析volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java5之后,volatile关键字才得以重获生机。volatile关键字虽然从字面上理解起来比较简单,但是......