[代码段] [java][guava] 字符串形式十六进制字符串与字节数组的转换

技术实战 技术实战 2498 人阅读 | 0 人回复

有的时候需要把十六机制的字符串,转换为相应的字节数组,或者反过来。

此处指的不是字符串转换为字节,而是"长得一样"的字节。

比如字符串“012F”转换为字节数组,存储的内容是0x01 0x2F,就是肉眼看着的内容是不变的。

那么如何把字符串形式的十六进制,转换为字节数组呢?

可以手工实现(参见下面的hexStringToByteArray) 如果不是非要自己手写代码的话,可以借助于guava包实现。

BaseEncoding.base16().decode BaseEncoding.base16().encode

image.png

public static void main(String[] args) {
        //打印guava解码后的字节数组
        System.out.println(bytes2hex(BaseEncoding.base16().decode("012F")));
        //打印自定义方法解码后的字节数组
        System.out.println(bytes2hex(hexStringToByteArray("012F")));
        //将字符串解码为字节,然后再把对应的字节进行编码成字符串
        String string = BaseEncoding.base16().encode(BaseEncoding.base16().decode("012F"));
        System.out.println(string);

    }

image.png

/**
     * 转换方法
     *
     * @param s
     * @return
     */
    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                    + Character.digit(s.charAt(i + 1), 16));
        }
        return data;
    }
/**
     * 字节转十六进制打印
     *
     * @param bytes
     * @return
     */
    public static String bytes2hex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        String tmp;
        sb.append("[");
        for (byte b : bytes) {
            // 将每个字节与0xFF进行与运算,然后转化为10进制,然后借助于Integer再转化为16进制
            tmp = Integer.toHexString(0xFF & b);
            if (tmp.length() == 1) {
                //只有一位的前面补个0
                tmp = "0" + tmp;
            }
            //每个字节用空格断开
            sb.append(tmp).append(" ");
        }
        //删除最后一个字节后面对于的空格
        sb.delete(sb.length() - 1, sb.length());
        sb.append("]");
        return sb.toString();
    }

common_log.png 转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-87-1-1.html

关注下面的标签,发现更多相似文章
    黄小斜学Java

    疯狂的字节X

  • 目前专注于分享Java领域干货,公众号同步更新。原创以及收集整理,把最好的留下。
    包括但不限于JVM、计算机科学、算法、数据库、分布式、Spring全家桶、微服务、高并发、Docker容器、ELK、大数据等相关知识,一起进步,一起成长。
热门推荐
[若依]微服务springcloud版新建增添加一个
[md]若依框架是一个比较出名的后台管理系统,有多个不同版本。
[CXX1300] CMake '3.18.1' was not
[md][CXX1300] CMake '3.18.1' was not found in SDK, PATH, or
海康摄像头接入 wvp-GB28181-pro平台测试验
[md]### 简介 开箱即用的28181协议视频平台 `https://github.c