我正在寻找一种将表示十六进制值的长字符串(从转储)转换为字节数组的方法.

我的措辞再好不过了,那人发了the same question here条.

但是为了保持它的原创性,我将以我自己的方式表达它:假设我有一个字符串"00A0BF",我想将其解释为

byte[] {0x00,0xA0,0xBf}

我该怎么办?

我是一名Java新手,最终使用了BigInteger并注意前导的十六进制零.但我觉得这很难看,我肯定我错过了一些简单的东西.

推荐答案

更新(2021)-Java 17现在包括java.util.HexFormat个(只花了25年):

HexFormat.of().parseHex(s)


For older versions of Java:

这里有一个我认为比目前发布的任何解决方案都更好的解决方案:

/* s must be an even-length string. */
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;
}

这是一种进步的原因:

  • 使用前导零(不同于BigInteger)和负字节值(不同于Byte.parseByte)是安全的

  • 不会将字符串转换为char[],也不会 for each 字节创建StringBuilder和字符串对象.

  • 没有可能不可用的库依赖项

如果参数不安全,可以通过assert或异常添加参数判断.

Java相关问答推荐

我可以从Java模块中排除maven资源文件夹吗?

如何审查Java dtos中的自定义注释字段?

Mat. n_Delete()和Mat. n_release的区别

ittext pdf延迟签名,签名无效

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

在AVL树的Remove方法中使用NoSuchElementException时遇到问题

Spring data JPA/Hibernate根据id获取一个列值

从Spring5迁移到Spring6:无法在雅加达包中找到类

Kotlin内联互操作:强制装箱

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

如何从错误通道回复网关,使其不会挂起

将ByteBuffer异步写入InputStream或Channel或类似对象

Java组件项目中的JavaFX对话框国际化

向Java进程发送`kill-11`会引发NullPointerException吗?

在ECLIPSE上的M1 Pro上运行JavaFX的问题

Java CDI:@Singleton@Startup@Inject无法实现接口

获取月份';s在java中非UTC时区的开始时间和结束时间

无泄漏函数的Java DRY