2017-07-31 24 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位數字可能太低。 –

相關問題