Java中的十六进制字符串到二进制

时间:2018-05-22 21:50:05

标签: java arrays string binary type-conversion

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

我发现,唯一的方法是从文件中读取行(使用bufferedReader),从中创建十六进制字符串数组,并将每个十六进制字符串数组成员转换为二进制字符串,以后可以转换使用parseByte到一个字节。

更清楚:

  • 读取行
  • 获取十六进制数组
  • 转换为二进制
  • 转换为字节)

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

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

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

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

  

01 23 45 67 89 AB CD EF

     

01 23 45 67 89 AB CD EF

我需要将其转换为此二进制密钥:

  

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。而且您只能将-127127之间的数字转换为二进制字符串。

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

  

线程“main”中的异常java.lang.NumberFormatException:值out   范围。价值:“100011”基数:16

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

2 个答案:

答案 0 :(得分:2)

我建议你使用一个相当简单的方法BigInteger::toString(int radix),它返回给定基数中的String表示。使用2表示二进制表示。

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

注意String必须是空白字符,并且使用这种方式你必须逐个处理它们。

答案 1 :(得分:1)

而不是使用较大的类型Byte.parseByte使用Integer进行解析。 Integer.parseInt将正常工作,如果您需要,可以将结果转换为字节。

但请记住,打印该字节会显示负数。如果您想将其视为无符号值,请按位执行0xff,如下所示:

byte b = 0xff;
System.out.println(b & 0xff); //Will print 255 instead of -1