成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 HexFormat 來格式化和解析十六進(jìn)制字符串

開發(fā) 前端
本文介紹了如何使用 JDK 17 新增的 HexFormat? 工具類來格式化和解析十六進(jìn)制字符串,通過 HexFormat 工具類還可以輕松地設(shè)置分隔符,字母大小寫以及前綴和后綴。

十六進(jìn)制(Hexadecimal)是一種數(shù)制系統(tǒng),它使用 16 個(gè)數(shù)字來表示數(shù)值,分別是 0 到 9 和 A 到 F。

十六進(jìn)制經(jīng)常用于表示字節(jié)數(shù)據(jù)。在十六進(jìn)制表示中,一個(gè)字節(jié)可以用兩個(gè)十六進(jìn)制數(shù)字表示。例如,字節(jié)的取值范圍是 0 到 255,可以用 00 到 FF 來表示。其中,00 表示二進(jìn)制的 00000000,F(xiàn)F 表示二進(jìn)制的 11111111。這在 Socket 通信協(xié)議的定義中很常見。

簡(jiǎn)單來說,對(duì)于一些較短的二進(jìn)制數(shù)據(jù),可以把它序列化為十六進(jìn)制字符串,其中每 2 個(gè)字符,表示一個(gè)字節(jié)。同樣,也可以把十六進(jìn)制的字符串解析為字節(jié)數(shù)組。最常見的場(chǎng)景就是把 Hash 計(jì)算的結(jié)果表示為十六進(jìn)制字符串。

通常我們可以選擇使用第三方的 commons-codec 庫來實(shí)現(xiàn)格式化和解析十六進(jìn)制字符串。可能是這個(gè)功能需求太常見,于是從JDK 17 開始,標(biāo)準(zhǔn)庫中提供了一個(gè) HexFormat 工具類,用于格式化和解析十六進(jìn)制字符串。

簡(jiǎn)單地編碼和解碼

簡(jiǎn)單地把字節(jié)數(shù)組編碼為十六進(jìn)制字符串,以及把十六進(jìn)制字符串解析為字節(jié)數(shù)組。

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 靜態(tài)方法創(chuàng)建 HexFormat 實(shí)例對(duì)象。然后調(diào)用 formatHex 方法來把字節(jié)數(shù)組格式化十六進(jìn)制字符串。最后再調(diào)用 parseHex 方法把十六進(jìn)制字符串解析為字節(jié)數(shù)組。

parseHex 和 parseHex 都有一些重載方法,可以指定字符串或者字節(jié)數(shù)組的區(qū)間:

  • 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)

執(zhí)行方法,輸出如下:

Hex=68656c6c6f20737072696e67646f632e636e
bytes=hello springdoc.cn

分隔符

在一些場(chǎng)景中,給十六進(jìn)制字符串中每一個(gè)字節(jié)之間添加一個(gè)分隔符可讀性會(huì)更好。

例如:68:65:6c:6c:6f:20:73:70:72:69:6e:67:64:6f:63:2e:63:6e。

// 通過 ofDelimiter 方法創(chuàng)建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 靜態(tài)方法,指定分隔符來創(chuàng)建 HexFormat 實(shí)例即可,同時(shí)也可以通過 delimiter 方法來獲取設(shè)置的分隔符。

輸出如下,每個(gè)字節(jié)(兩個(gè)字符)之間都添加了指定的分隔符:

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

前綴和后綴

也可以給每個(gè)字節(jié),即每?jī)蓚€(gè)十六進(jìn)制字符串設(shè)置前綴和后綴。

HexFormat format = HexFormat.ofDelimiter(":")
        .withPrefix("[")    // 設(shè)置前綴
        .withSuffix("]")    // 設(shè)置后綴
        ;

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 方法來設(shè)置前綴和后綴。注意 HexFormat 是不可變的對(duì)象(類似于 String),所以任何修改都會(huì)返回一個(gè)新的 HexFormat 對(duì)象。

輸出如下:

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

大小寫

十六進(jìn)制中有 A - F 字母,也可以設(shè)置字母的大小寫。

HexFormat format = HexFormat.of()
    //  .withLowerCase()    // 字母小寫,默認(rèn)
        .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(默認(rèn))和 withUpperCase 方法來設(shè)置十六進(jìn)制字符串中字母的大小寫,通過 isUpperCase 方法來獲取是否開啟了大寫。

輸出如下:

Hex=68656C6C6F20737072696E67646F632E636E
bytes=hello springdoc.cn
大寫=true

實(shí)際案例

最后來看一個(gè)實(shí)際案例,把 SHA256 哈希值編碼為十六進(jìn)制字符串:

package cn.springdoc.demo.test;

import java.security.MessageDigest;
import java.util.HexFormat;

public class Main {

    public static void main(String[] args) throws Exception {

        // 創(chuàng)建 SHA256 MessageDigest
        MessageDigest digest = MessageDigest.getInstance("SHA256");
        
        // 計(jì)算字符串 "123456" 的哈希值
        byte[] sha256 = digest.digest("123456".getBytes());
        
        // 把哈希結(jié)果編碼為十六進(jìn)制字符串
        String sha256Hex = HexFormat.of().withUpperCase().formatHex(sha256);
        
        System.out.println(sha256Hex);
    }
    }

輸出如下:

8D969EEF6ECAD3C29A3A629280E686CF0C3F5D5A86AFF3CA12020C923ADC6C92

總結(jié)

本文介紹了如何使用 JDK 17 新增的 HexFormat 工具類來格式化和解析十六進(jìn)制字符串,通過 HexFormat 工具類還可以輕松地設(shè)置分隔符,字母大小寫以及前綴和后綴。

責(zé)任編輯:武曉燕 來源: SpringBoot中文站
相關(guān)推薦

2010-02-01 16:46:07

C++格式化字符串

2013-07-25 15:01:47

iOS開發(fā)學(xué)習(xí)十六進(jìn)制和字符串轉(zhuǎn)換

2021-06-09 07:55:18

Python格式化字符串

2009-11-26 18:36:52

PHP函數(shù)sprint

2024-12-09 08:10:00

Python字符串格式化

2009-09-02 15:56:49

C#格式化字符串

2009-09-03 18:45:06

GridView格式化

2022-05-09 14:04:27

Python字符串格式化輸出

2017-01-16 16:33:06

Python 字符串漏洞

2020-06-28 08:26:41

Python開發(fā)工具

2009-09-03 18:05:04

ASP.NET字符串格

2020-09-02 07:19:41

printf 格式化輸出Unix

2024-01-02 08:43:48

qs工具庫格式化

2024-03-06 08:41:14

Python字符串格式化工具

2024-02-22 09:46:04

C++字符串格式化開發(fā)

2010-08-03 10:46:41

Flex代碼格式化

2022-03-28 10:56:11

Python字符串格式化

2009-08-28 10:55:16

C#實(shí)現(xiàn)轉(zhuǎn)換十六進(jìn)制

2024-05-27 00:10:00

2010-01-07 17:58:49

JSON數(shù)值
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: a级黄色毛片免费播放视频 国产精品视频在线观看 | 伊人网综合在线 | 成年女人免费v片 | 天天看逼| 成人精品视频在线观看 | 99国产精品视频免费观看一公开 | 黑人巨大精品欧美黑白配亚洲 | 久久久久久久久久久久久久国产 | 在线观看视频91 | 欧美日韩精品中文字幕 | 成人久久网 | 日韩欧美一区在线 | 在线一区视频 | 99re视频精品 | 久久久久久国产精品 | 亚洲精品久久久久久久久久吃药 | 超碰免费在 | 国产日韩免费视频 | 亚洲成人av| 亚洲精品粉嫩美女一区 | 久久久久成人精品免费播放动漫 | 丁香六月激情 | 亚洲一区二区精品视频 | 精品视频一区二区 | 亚洲国产二区 | 欧美日韩午夜精品 | 超碰导航 | 国产精品久久久久久久久久免费看 | 免费黄色a视频 | 亚洲影音 | 国产成人精品久久二区二区91 | 最近中文字幕在线视频1 | 精品久久久久久久久久久久久久 | 天堂亚洲 | 国产成人在线一区二区 | 国产高清在线观看 | 国产午夜精品一区二区 | 欧美精品在线免费观看 | 国产精品免费大片 | 成年免费在线观看 | 欧美精品一区二区在线观看 |