使用前导零将十六进制转换为二进制
Posted
技术标签:
【中文标题】使用前导零将十六进制转换为二进制【英文标题】:Converting hex to binary with leading zeros 【发布时间】:2015-11-18 02:33:33 【问题描述】:我遵循以下方法
new Biginteger(str,16).toString(2);
它工作得很好,但它删除了前导零。如果输入字符串是“3031323334353637”,我需要 64 位输出
但它返回 62 个字符。我可以使用 for 循环来做到这一点。没有循环还有其他方法吗?
目标:将十六进制转换为带前导零的二进制
【问题讨论】:
你不是说它会删除前导零吗? 【参考方案1】:您可以使用String.format("%64s")
填充空格,然后用零替换空格。这具有适用于任何大小的输入的优点,而不仅仅是 int 范围内的输入。我猜你正在处理使用 BigInteger 的任意输入......
String value = new BigInteger("3031323334353637", 16).toString(2);
System.out.println(String.format("%64s", value).replace(" ", "0"));
输出
0011000000110001001100100011001100110100001101010011011000110111
说明... String.format("%64s, value) 输出前面的字符串填充以填充 64 个字符。
" 11000000110001001100100011001100110100001101010011011000110111"
然后使用 String.replace(oldString, newString) 将前导空格替换为“0”字符
"0011000000110001001100100011001100110100001101010011011000110111"
【讨论】:
谢谢。有用。但我试图了解您的解决方案。第一个 stmt 返回 62 个字符。在 sec stmt 中,创建宽度 64 并将值存储在该 64 位中。在此示例中,高位将有 2 个空格。它被 0 替换。我说的对吗?请告诉我 我已经添加了一些关于它如何工作的更多细节......如果这有助于完全解释它,请告诉我。 谢谢大佬 :) 我明白了【参考方案2】:以下可能是最简单的:
new BigInteger("1" + str,16).toString(2).substring(1)
【讨论】:
虽然是个 hack,但非常天才! 顺便说一句,它适用于所有长度。基数是 16,而不是长度。 你是对的。我会更新答案。【参考方案3】:查看this question。
您可以使用String.format()
:
String unpaddedBinary = new BigInteger("a12", 16).toString(2);
String paddedBinary = String.format("%064s", Integer.parseInt(unpaddedBinary, 2));
【讨论】:
它的输出是 0000000000000000000000000000000000000000000000000000000000002578...肯定不正确... %064d" 格式为十进制,而不是二进制... 您也可以直接使用BigInteger.intValue
将BigInteger
转换为int
。虽然如果它适合int
,那么首先应该只使用int
(而不是BigInteger
),如果它不适合int
,这将不起作用。
@Dukeling 哦,我的错,请参考Adam's answer,他的似乎是正确的。以上是关于使用前导零将十六进制转换为二进制的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]
在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]
将带有前导“0x”的十六进制字符串转换为C++中的有符号短字符串?