【问题标题】:Hex string to binary in JavaJava中的十六进制字符串到二进制
【发布时间】: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

但是,第五个十六进制数字是89137 是一个整数。而且只能将-127127 之间的数字转换成二进制字符串。

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

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

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

【问题讨论】:

  • 将每个数字表示为 4 位(又名 nibble)。那么你的“第五个十六进制数”是89(或10001001)。
  • @ElliottFrisch 你能解释一下如何做到这一点吗?我试过搜索如何将数字表示为 4 位但失败了。任何信息将不胜感激
  • 您绝对需要在将十六进制值转换为字节之前将其转换为二进制;您有多种选择可以避免这样做
  • @LiJonas :您的问题始于“我正在做一个加密密码,需要从文件中读取十六进制密钥并将其转换为 bytes[] 数组。”;另一篇文章的开头是“我正在寻找一种将长字符串(来自转储)转换为字节数组的方法,该字符串表示十六进制值。”你能解释一下它们有什么不同吗?

标签: java arrays string binary type-conversion


【解决方案1】:

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

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

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

【讨论】:

  • 是的,这是解决整个问题的好方法。我的只解决了解析部分。
  • 请注意它缺少 7 个零的初始前缀。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-07-15
    • 2012-11-20
    • 1970-01-01
    • 2016-02-26
    • 2015-05-26
    • 2016-07-25
    • 2012-12-12
    • 2013-03-22
    相关资源
    最近更新 更多