首页 > 解决方案 > Java中的十六进制字符串到二进制

问题描述

我正在做一个加密密码,它需要从文件中读取一个十六进制密钥并将其转换为bytes[]数组。

正如我发现的那样,唯一的方法是从文件中读取行(使用 bufferedReader),从中创建十六进制字符串数组,并将每个十六进制字符串数组成员转换为二进制字符串,然后再将其转换为字节使用解析字节。

为了更清楚:

所以,基本上,它看起来像这样:hex[i]是来自十六进制数组的字符串。

requiredByte[i] = Byte.parseByte(hexToBinary(hex[i]), 2);

因此,对于我的工作方法,我需要从文件中读取十六进制密钥并将其转换为二进制字符串。

十六进制中的键看起来像这样(是的,两行都是相同的):

01 23 45 67 89 AB CD 英孚

01 23 45 67 89 AB CD 英孚

我需要把它转换成这个二进制密钥:

0000 0001 0010 0011 0100 0101 0110 0111

1000 1001 1010 1011 1100 1101 1110 1111

0000 0001 0010 0011 0100 0101 0110 0111

1000 1001 1010 1011 1100 1101 1110 1111

但是,第五个十六进制数是89,它是137一个整数。-127而且您只能将数字转换127为二进制字符串。

当我尝试以自己的方式转换十六进制数 89 时,我在控制台中收到此消息:

线程“主”java.lang.NumberFormatException 中的异常:值超出范围。值:“100011” 基数:16

你们对如何将十六进制转换为二进制,甚至如何将十六进制String[]数组转换为byte[]数组有任何想法吗?

标签: javaarraysstringbinarytype-conversion

解决方案


我建议您使用一个相当简单的方法BigInteger::toString(int radix),它以给定的基数返回字符串表示形式。用于2二进制表示。

// 100100011010001010110011110001001101010111100110111101111
new BigInteger("0123456789ABCDEF", 16).toString(2);

请注意,字符串必须不含空白字符,并且使用这种方式,您必须从数组中逐一处理它们。


推荐阅读