繁体   English   中英

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

[英]Hex string to binary in Java

我正在做一个加密密码,它需要从文件中读取一个十六进制密钥,并将其转换为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时,会在控制台中收到以下消息:

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM