【发布时间】:2018-05-22 21:50:04
【问题描述】:
我正在做一个加密密码,它需要从文件中读取一个十六进制密钥并将其转换为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 是一个整数。而且只能将-127 和127 之间的数字转换成二进制字符串。
当我尝试以自己的方式转换十六进制数字 89 时,我在控制台中收到以下消息:
线程“主”java.lang.NumberFormatException 中的异常:值输出 的范围。值:"100011" 基数:16
你们对如何将十六进制转换为二进制,甚至如何将十六进制 String[] 数组转换为 byte[] 数组有任何想法吗?
【问题讨论】:
-
将每个数字表示为 4 位(又名 nibble)。那么你的“第五个十六进制数”是
8和9(或1000和1001)。 -
@ElliottFrisch 你能解释一下如何做到这一点吗?我试过搜索如何将数字表示为 4 位但失败了。任何信息将不胜感激
-
您绝对不需要在将十六进制值转换为字节之前将其转换为二进制;您有多种选择可以避免这样做
-
@LiJonas :您的问题始于“我正在做一个加密密码,需要从文件中读取十六进制密钥并将其转换为 bytes[] 数组。”;另一篇文章的开头是“我正在寻找一种将长字符串(来自转储)转换为字节数组的方法,该字符串表示十六进制值。”你能解释一下它们有什么不同吗?
标签: java arrays string binary type-conversion