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

Java中的十六进制字符串到二进制,java,arrays,string,binary,type-conversion,Java,Arrays,String,Binary,Type Conversion,我正在做一个加密密码,需要从文件中读取一个十六进制密钥并将其转换为bytes[]数组 我发现,唯一的方法是使用bufferedReader从文件中读取行,从行中创建十六进制字符串数组,并将每个十六进制字符串数组成员转换为二进制字符串,然后使用parseByte将其转换为字节 更清楚地说: 读线 获取十六进制数组 转换成二进制 转换为字节 基本上,它看起来是这样的:hex[i]是来自hex数组的字符串 requiredByte[i] = Byte.parseByte(hexToBinary(hex

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

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

更清楚地说:

读线 获取十六进制数组 转换成二进制 转换为字节 基本上,它看起来是这样的:hex[i]是来自hex数组的字符串

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是一个整数。您只能将-127和127之间的数字转换为二进制字符串

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

主线程java.lang.NumberFormatException中的异常:值输出 射程。值:100011基数:16

你们知道如何将十六进制转换为二进制,甚至如何将十六进制字符串[]数组转换为字节[]数组吗?

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

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

byte b = 0xff;
System.out.println(b & 0xff); //Will print 255 instead of -1
而不是使用Byte进行解析。使用更大的类型(如Integer)解析Byte。parseInt可以正常工作,如果需要的话,可以将结果转换为一个字节

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

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

我建议您使用一个相当简单的方法,以给定的基数返回字符串表示形式。使用2作为二进制表示

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

请注意,字符串必须是无空白字符的,使用这种方式,您必须从数组中逐个处理它们。

我建议您使用一种相当简单的方法,以给定的基数返回字符串表示形式。使用2作为二进制表示

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

注意:字符串必须是无空白字符的,使用这种方式,您必须从数组中逐个处理它们。

将每个数字表示为4位,即a。那么你的第五个十六进制数是8和9或者1000和1001。可能是@ElliottFrisch的重复。你能解释一下怎么做吗?我曾尝试搜索如何将数字表示为4位,但失败了。任何信息都会被高度重视。在将十六进制值转换为字节之前,您绝对不需要将十六进制值转换为二进制;你有几个选择可以避免这样做that@LiJonas:您的问题开始于我正在做一个加密密码,需要从文件中读取一个十六进制密钥并将其转换为bytes[]数组。;另一篇文章的开头是,我正在寻找一种将转储中的长字符串(表示十六进制值)转换为字节数组的方法。你能解释一下它们有什么不同吗?把每个数字表示为4位,也就是a。那么你的第五个十六进制数是8和9或者1000和1001。可能是@ElliottFrisch的重复。你能解释一下怎么做吗?我曾尝试搜索如何将数字表示为4位,但失败了。任何信息都会被高度重视。在将十六进制值转换为字节之前,您绝对不需要将十六进制值转换为二进制;你有几个选择可以避免这样做that@LiJonas:您的问题开始于我正在做一个加密密码,需要从文件中读取一个十六进制密钥并将其转换为bytes[]数组。;另一篇文章的开头是,我正在寻找一种将转储中的长字符串(表示十六进制值)转换为字节数组的方法。你能解释一下它们有什么不同吗?是的,这是解决整个问题的好办法。我的只解决解析部分。请注意,它缺少7个零的初始前缀。是的,这是解决整个问题的一个很好的方法。Mine只解决解析部分。请注意,它缺少7个零的初始前缀。