java - 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[]
数组有任何想法吗?
解决方案
我建议您使用一个相当简单的方法BigInteger::toString(int radix)
,它以给定的基数返回字符串表示形式。用于2
二进制表示。
// 100100011010001010110011110001001101010111100110111101111
new BigInteger("0123456789ABCDEF", 16).toString(2);
请注意,字符串必须不含空白字符,并且使用这种方式,您必须从数组中逐一处理它们。
推荐阅读
- c++ - 如何定义一个忽略转义序列的字符串?
- dialogflow-es - 如何在 C# 中为对话框流设置输入上下文
- javascript - Angular,NgRx:FormControl patchValue() 失败并显示“无法分配给只读属性 '_pendingValue'”
- jq - JQ去掉数据之间的输出逗号
- list - 如何从现有对象列表中创建新对象列表?
- python - 从大字典中删除元素,就地
- sql - 仅在 PostgreSQL 中使用带有选定值的过滤器对列值求和
- excel - XML 中的节点似乎无法识别/可利用
- java - 在实现带有片段的 TabLayout 时获得 NoClassDefFoundError 并且在片段内部想要使用回收器视图
- reactjs - 只有在我返回单元格编辑后,React-Bootstrap-Table2 的单元格才会刷新