当前位置:首页 > 科技  > 软件

使用 HexFormat 来格式化和解析十六进制字符串

来源: 责编: 时间:2024-03-28 17:51:49 277观看
导读十六进制(Hexadecimal)是一种数制系统,它使用 16 个数字来表示数值,分别是 0 到 9 和 A 到 F。十六进制经常用于表示字节数据。在十六进制表示中,一个字节可以用两个十六进制数字表示。例如,字节的取值范围是 0 到 255,可以

十六进制(Hexadecimal)是一种数制系统,它使用 16 个数字来表示数值,分别是 0 到 9 和 A 到 F。R0P28资讯网——每日最新资讯28at.com

十六进制经常用于表示字节数据。在十六进制表示中,一个字节可以用两个十六进制数字表示。例如,字节的取值范围是 0 到 255,可以用 00 到 FF 来表示。其中,00 表示二进制的 00000000,FF 表示二进制的 11111111。这在 Socket 通信协议的定义中很常见。R0P28资讯网——每日最新资讯28at.com

简单来说,对于一些较短的二进制数据,可以把它序列化为十六进制字符串,其中每 2 个字符,表示一个字节。同样,也可以把十六进制的字符串解析为字节数组。最常见的场景就是把 Hash 计算的结果表示为十六进制字符串。R0P28资讯网——每日最新资讯28at.com

通常我们可以选择使用第三方的 commons-codec 库来实现格式化和解析十六进制字符串。可能是这个功能需求太常见,于是从JDK 17 开始,标准库中提供了一个 HexFormat 工具类,用于格式化和解析十六进制字符串。R0P28资讯网——每日最新资讯28at.com

简单地编码和解码

简单地把字节数组编码为十六进制字符串,以及把十六进制字符串解析为字节数组。R0P28资讯网——每日最新资讯28at.com

package cn.springdoc.demo.test;import java.util.HexFormat;public class Main {    public static void main(String[] args) throws Exception {                HexFormat format = HexFormat.of();                String hex = format.formatHex("hello springdoc.cn".getBytes());        System.out.println("Hex=" + hex);                byte[] bytes = format.parseHex(hex);        System.out.println("bytes=" + new String(bytes));    }}

首先,通过 of 静态方法创建 HexFormat 实例对象。然后调用 formatHex 方法来把字节数组格式化十六进制字符串。最后再调用 parseHex 方法把十六进制字符串解析为字节数组。R0P28资讯网——每日最新资讯28at.com

parseHex 和 parseHex 都有一些重载方法,可以指定字符串或者字节数组的区间:R0P28资讯网——每日最新资讯28at.com

  • String formatHex(byte[] bytes)
  • String formatHex(byte[] bytes, int fromIndex, int toIndex)
  • <A extends Appendable> A formatHex(A out, byte[] bytes)
  • <A extends Appendable> A formatHex(A out, byte[] bytes, int fromIndex, int toIndex)
  • byte[] parseHex(CharSequence string)
  • byte[] parseHex(CharSequence string, int fromIndex, int toIndex)
  • byte[] parseHex(char[] chars, int fromIndex, int toIndex)

执行方法,输出如下:R0P28资讯网——每日最新资讯28at.com

Hex=68656c6c6f20737072696e67646f632e636ebytes=hello springdoc.cn

分隔符

在一些场景中,给十六进制字符串中每一个字节之间添加一个分隔符可读性会更好。R0P28资讯网——每日最新资讯28at.com

例如:68:65:6c:6c:6f:20:73:70:72:69:6e:67:64:6f:63:2e:63:6e。R0P28资讯网——每日最新资讯28at.com

// 通过 ofDelimiter 方法创建HexFormat,指定分隔符HexFormat format = HexFormat.ofDelimiter(":");String hex = format.formatHex("hello springdoc.cn".getBytes());System.out.println("Hex=" + hex);byte[] bytes = format.parseHex(hex);System.out.println("bytes=" + new String(bytes));// 获取分隔符String delimiter = format.delimiter();System.out.println("分隔符=" + delimiter);

只需要通过 ofDelimiter 静态方法,指定分隔符来创建 HexFormat 实例即可,同时也可以通过 delimiter 方法来获取设置的分隔符。R0P28资讯网——每日最新资讯28at.com

输出如下,每个字节(两个字符)之间都添加了指定的分隔符:R0P28资讯网——每日最新资讯28at.com

Hex=68:65:6c:6c:6f:20:73:70:72:69:6e:67:64:6f:63:2e:63:6ebytes=hello springdoc.cn分隔符=:

前缀和后缀

也可以给每个字节,即每两个十六进制字符串设置前缀和后缀。R0P28资讯网——每日最新资讯28at.com

HexFormat format = HexFormat.ofDelimiter(":")        .withPrefix("[")    // 设置前缀        .withSuffix("]")    // 设置后缀        ;String hex = format.formatHex("hello springdoc.cn".getBytes());System.out.println("Hex=" + hex);byte[] bytes = format.parseHex(hex);System.out.println("bytes=" + new String(bytes));System.out.println("前缀=" + format.prefix() + ", 后缀=" + format.suffix());

通过 withPrefix 和 withSuffix 方法来设置前缀和后缀。注意 HexFormat 是不可变的对象(类似于 String),所以任何修改都会返回一个新的 HexFormat 对象。R0P28资讯网——每日最新资讯28at.com

输出如下:R0P28资讯网——每日最新资讯28at.com

Hex=[68]:[65]:[6c]:[6c]:[6f]:[20]:[73]:[70]:[72]:[69]:[6e]:[67]:[64]:[6f]:[63]:[2e]:[63]:[6e]bytes=hello springdoc.cn前缀=[, 后缀=]

大小写

十六进制中有 A - F 字母,也可以设置字母的大小写。R0P28资讯网——每日最新资讯28at.com

HexFormat format = HexFormat.of()    //  .withLowerCase()    // 字母小写,默认        .withUpperCase()    // 字母大写        ;String hex = format.formatHex("hello springdoc.cn".getBytes());System.out.println("Hex=" + hex);byte[] bytes = format.parseHex(hex);System.out.println("bytes=" + new String(bytes));System.out.println("大写=" + format.isUpperCase());

通过 withLowerCase(默认)和 withUpperCase 方法来设置十六进制字符串中字母的大小写,通过 isUpperCase 方法来获取是否开启了大写。R0P28资讯网——每日最新资讯28at.com

输出如下:R0P28资讯网——每日最新资讯28at.com

Hex=68656C6C6F20737072696E67646F632E636Ebytes=hello springdoc.cn大写=true

实际案例

最后来看一个实际案例,把 SHA256 哈希值编码为十六进制字符串:R0P28资讯网——每日最新资讯28at.com

package cn.springdoc.demo.test;import java.security.MessageDigest;import java.util.HexFormat;public class Main {    public static void main(String[] args) throws Exception {        // 创建 SHA256 MessageDigest        MessageDigest digest = MessageDigest.getInstance("SHA256");                // 计算字符串 "123456" 的哈希值        byte[] sha256 = digest.digest("123456".getBytes());                // 把哈希结果编码为十六进制字符串        String sha256Hex = HexFormat.of().withUpperCase().formatHex(sha256);                System.out.println(sha256Hex);    }    }

输出如下:R0P28资讯网——每日最新资讯28at.com

8D969EEF6ECAD3C29A3A629280E686CF0C3F5D5A86AFF3CA12020C923ADC6C92

总结

本文介绍了如何使用 JDK 17 新增的 HexFormat 工具类来格式化和解析十六进制字符串,通过 HexFormat 工具类还可以轻松地设置分隔符,字母大小写以及前缀和后缀。R0P28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-80199-0.html使用 HexFormat 来格式化和解析十六进制字符串

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 面试官:说说Spring中IoC实现原理?

下一篇: SaaS多租户架构数据源动态切换解决方案

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 不容错过的MSBuild技巧,必备用法详解和实践指南

    一、MSBuild简介MSBuild是一种基于XML的构建引擎,用于在.NET Framework和.NET Core应用程序中自动化构建过程。它是Visual Studio的构建引擎,可在命令行或其他构建工具中使用
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    10月30日,据韩国媒体消息,自今年年初以来一直在上涨的 DRAM 存储器的交易价格仅在本月就下跌了近 10%,此次是全年首次降价,而NAND 闪存本月价格与上月持平。市
Top