【问题标题】:Hex to Binary String Java十六进制到二进制字符串 Java
【发布时间】:2014-07-15 13:27:45
【问题描述】:

我现在正在进行加密,在第 7 步中,我需要将 HEX 字符串数组(我已从 ASCII 转换为字符串数组)转换为二进制字符串。

public static void main(String[] args)  { 
System.out.println("HEX to Binary: ");
String[] stringHextoBinary = new String[HS.length]; //HS is the String Array for Hex           numbers that i save from last step

StringBuilder builder = new StringBuilder();
int l = 0;
for(String s : HS) {
    builder.append(s);
    if (s.length()<=1){
       stringHextoBinary[l] = HexToBinary(s.charAt(0));
         l++;
   System.out.print(HexToBinary(s.charAt(0)) + ",");

 }else{
    stringHextoBinary[l] = HexToBinary(s.charAt(0))+HexToBinary(s.charAt(1));
        l++;
                   System.out.print(HexToBinary(s.charAt(0))+HexToBinary(s.charAt(1))+",");
 }              

 public static String HexToBinary(char Hex) {
            int i = Integer.parseInt(Character.toString(Hex), 16);
            String Bin = Integer.toBinaryString(i);
            return Bin;
      }                 
 }

if 语句可以与 HEX 一起使用,当它有一个数字或两个数字时。 但我的问题是它打印出来 十六进制转二进制: 11100,111,111,10111,11101, 它失去了0。 :(

这样当我加密单词“apple”并用相同的代码解密时,将返回单词“pppxl”:(

希望我能尽快得到答复,非常感谢!

【问题讨论】:

  • 十六进制字符串数组是“34 7 7 b1 35”
  • 我尝试了一些将十六进制转换为二进制的网络工具,结果应该是“00110100 01110111 10110001 00110101”
  • 在我的答案中添加了一些代码以正确填充二进制字符串,借用大卫所说的。
  • 废弃了大卫的代码并添加了一些我自己的。如果您想尝试一下,我相信它会为您服务。

标签: java encryption binary hex


【解决方案1】:

使用Apache commonsStringUtils类的这个方法

public String leftPad(String str, int size, char padding);

在您将号码转换为 0 和 1 之后。它可能看起来像

String paddedBin = StringUtils.leftPad(bin, 8, '0');

例如。不确定您实际上要填充多少位数。

【讨论】:

  • 抱歉无法合并你们的代码 :( 而且我还有一种方法可以使用 String[] 将原始单词转换为 Hex,因此该方法不能是 HexToBinary(String Hex) .并且由于我在Main中结合了这些方法(单词到birnay->二进制到十六进制->十六进制到字符串),所以我实际上不明白在哪里添加你的代码:P你能解释更多吗?
  • 不要将此与任何其他答案结合使用。我写这个答案是为了独立,而不是作为“混音器”。只需获取您的原始代码,然后在您的 HexToBinary 方法的末尾添加我的答案的一行。然后不返回bin,而是返回paddedBin
  • 您是否下载了 Apache 公共库并将其添加到您的项目中?
  • no.. 我应该加载哪一个?是放在我的图书馆里吗?
  • 嗯,是的。只需获取最新版本的 Apache commons。将 JAR 文件添加到您的项目将看到的某个位置 - 可能您有一个名为“lib”的目录,或类似的目录。
【解决方案2】:

您可以简单地让它接受一个字符串并将其转换为二进制,而不是您的方法接受字符:

public static void main(String[] args)  { 
System.out.println("HEX to Binary: ");
String[] stringHextoBinary = new String[HS.length]; //HS is the String Array for Hex           numbers that i save from last step

// creates the string builder, count, and declaration
StringBuilder builder = new StringBuilder();
int l = 0;
string binaryDigits;

// iterates through string array and appends to string that's being built
// (for whatever reason)
for(String s : HS) {
    builder.append(s);
    binaryDigits = HexToBinary(s);
    stringHextoBinary[l++] = binaryDigits;
    System.out.print(binaryDigits);
}

// transforms hex string to binary string without losing 0's
public static String HexToBinary(String Hex) {
    string toReturn = new BigInteger(Hex, 16).toString(2);
    return String.format("%" + (Hex.length*4) + "s", toReturn).replace(' ', '0')
}

您不需要组合代码,因为这是将字符串转换为用空格分隔的二进制字符串所需的所有代码。它将遍历并将每个字符串更改为二进制字符串。

【讨论】:

  • @Downvoter,对否决票有什么解释吗?不知道我的回答在这个问题上缺少什么。
  • 使用 BigInteger 转换为十六进制将使您失去设置为零的初始位。请注意,我没有投反对票(还)。
  • 编辑不丢失零位
  • 抱歉无法合并你们的代码 :( 而且我还有一种方法可以使用 String[] 将原始单词转换为 Hex,因此该方法不能是 HexToBinary(String Hex) .并且由于我在Main中结合了这些方法(单词到birnay->二进制到十六进制->十六进制到字符串),所以我实际上不明白在哪里添加你的代码:P你能解释更多吗?
  • 添加了一些 cmets。从本质上讲,这就是从字符串转换为二进制字符串所需的所有代码。
【解决方案3】:

试试这个方法实现:

public static String hexCharToBinary(char c) {
    final int v;
    if (c >= '0' && c <= '9') {
        v = c - '0';
    } else if (c >= 'A' && c <= 'F') {
        v = 10 + c - 'A';
    } else if (c >= 'a' && c <= 'f') {
        v = 10 + c - 'a';
    } else {
        throw new IllegalArgumentException();
    }
    return String.format("%4s", Integer.toBinaryString(v & 0xFF)).replace(' ', '0');
}    

【讨论】:

  • 请注意,您应该先将十六进制转换为字节,然后再将字节转换为二进制编码以供查看。
【解决方案4】:

试试这个:

stringHextoBinary[l] = new BigInteger(s,16).toString(2);

这样做是为您的十六进制数字创建一个基数为 16 的新整数,然后将其转换为以 2 为底的字符串(二进制)。由于我不在安装 jvm 的计算机附近,因此尚未对此进行测试,但这只是一个想法,因为您似乎急需想法。

这应该也可以:

stringHextoBinary[l] = Integer.toBinaryString(Integer.parseInt(s, 16));

【讨论】:

  • sorry :( 不能用,谢谢你这么快回复 :)
猜你喜欢
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 2015-05-26
  • 2016-07-25
  • 2012-12-12
  • 1970-01-01
相关资源
最近更新 更多