2017-07-31 26 views
1

我试图用OTP(One Time Pad)加密。我编写了一个“测试”代码来查看我是否正确或不正确。我的二进制文件中缺少一个“0” - 我该如何解决它?

final String message = "Hello"; 
    char character; 
    String binary; 

    for (int i = 0; i < message.length(); i++) { 
     character = message.charAt(i); 
     binary = Integer.toBinaryString(character); 
     System.out.println(character + ": " + binary); 
    } 

因此,有以下几点:

H: 1001000 
e: 1100101 
l: 1101100 
l: 1101100 
o: 1101111 

这是不是真的正确。我在inet中进行了搜索,例如,H的二进制文件,例如H的二进制文件

01001000 

缺少一个“0”。我怎样才能解决这个问题?

+0

领先零层的不显著。 (除非你是007)01 = 1 = 000000000000000000000001正确:) –

+0

你的代码是正确的。您可以从二进制中删除前导零,就像您可以从十进制数字00999(999)中删除前导零一样。 – Michael

回答

1

而不是binary = Integer.toBinaryString(character);

使用下面的表达式:

binary = String.format("%8s", Integer.toBinaryString(character)).replace(' ', '0'); 
0

缺少的零是前导零。二进制表示本质上是数字,这意味着前导零不具有任何意义。因此他们被排除在外;数字01001000等于数字1001000

如果您确实想要打印这些前导零,我建议您使用字符串格式化函数来解决此问题,该函数可打印确切的数字位数,而不考虑数字的长度。

0

另一种选择是使用DecimalFormat

private static String format(Integer value, String format) 
    { 
    DecimalFormat myFormatter = new DecimalFormat(format); 
    return myFormatter.format(value); 
    } 

有了这个,你可以直接到达的数量和格式应在其中显示。就像这样:

System.out.println(format(1001000 , "00000000")); 

随着0的格式,你说数字0具有显示或含义,如果你的格式是长于实际数量领先的地方将显示为0在达到该数目。 如果你读了JavaDoc你会发现部分

特殊模式字符

在那里,你可以看到你的格式,他们会做的选项概述。

编辑:

正如奥利弗在它是需要再次转换的评论中指出。 当您转换您的性格与Integer.toBinaryString(character); 你可以施放String回龙与Long.valueOf(),然后达到它变成运作或只是重构方法:

private static String format(String value, String format) 
    { 
    DecimalFormat myFormatter = new DecimalFormat(format); 
    return myFormatter.format(Long.valueOf(value)); 
    } 
+0

DecimalFormat不支持二进制。那么你如何做这件事? –

+0

@OlivierGrégoire答案得到更新。这很简单,因为他只需要将二进制表示从String再次转换为Integer。 – Nico

+0

随着更新,如果我通过'“1010101010101010”',它会失败。 OP通过'char'。字符串表示中最多可以有16个二进制数字。你的解决方案真的把它限制为9.我强烈建议修改答案,使它可以用任何字符/整数。在这种情况下,'DecimalFormat'没有用。 OP说他期望8位数字,但是用整数可以达到32位。这个答案也不能解释为什么8位数字可能太低。 –

相关问题