2014-01-28 34 views
1

我在寫一個小應用程序的函數來打破一個可回收的一次性密碼密碼。在我職業生涯的大部分時間使用VB.NET後,我認爲在C#中實現應用程序會很有趣。但是,由於我目前不熟悉C#,所以遇到了一個問題。轉換字符數組到字符串的問題

該函數需要兩個字符串(二進制數字),將這些字符串轉換爲char數組,然後對它們執行XOR並將結果放入第三個char數組中。

這很好,直到我嘗試將第三個字符數組轉換爲字符串。而不是看起來像「11001101」等字符串,我得到以下結果:「\ 0 \ 0 \ 0」,即「1」由空格表示,「0」由「\ 0」表示。

我的代碼如下:

public string calcXor(string a, string b) 
    { 
     char[] charAArray = a.ToCharArray(); 
     char[] charBArray = b.ToCharArray(); 

     int len = 0; 

     // Set length to be the length of the shorter string 
     if (a.Length > b.Length) 
      len = b.Length - 1; 
     else 
      len = a.Length - 1; 

     char[] result = new char[len]; 

     for (int i = 0; i < len; i++) 
     { 
      result[i] = (char)(charAArray[i]^charBArray[i]); 
     } 

     return new string(result); 
    } 
+2

如果你不異或二進制數據表示字符,而不是代表二進制數據字符「1 '和'0'?從你所問的內容稍微退一步,但.. –

+0

我只是等待我的聲望達到15,然後我可以回答投票。 –

回答

2

您的問題是在該行

result[i] = (char)(charAArray[i]^charBArray[i]); 

,應該是

// (Char) 1 is not '1'! 
    result[i] = (char)((charAArray[i]^charBArray[i]) + '0'); 

更緊湊的解決方案是使用StringBuilder,不是數組:

public string calcXor(String a, String b) { 
    int len = (a.Length < b.Length) ? a.Length : b.Length; 

    StringBuilder Sb = new StringBuilder(); 

    for (int i = 0; i < len; ++i) 
    // Sb.Append(CharToBinary(a[i]^b[i])); // <- If you want 0's and 1's 
    Sb.Append(a[i]^b[i]); // <- Just int, not in binary format as in your solution 

    return Sb.ToString(); 
} 

public static String CharToBinary(int value, Boolean useUnicode = false) { 
    int size = useUnicode ? 16 : 8; 

    StringBuilder Sb = new StringBuilder(size); 

    Sb.Length = size; 

    for (int i = size - 1; i >= 0; --i) { 
    Sb[i] = value % 2 == 0 ? '0' : '1'; 
    value /= 2; 
    } 

    return Sb.ToString(); 
} 

你解決方案只是計算異或(例如「65」)並將它們放在一行中(例如, 65728 ...);如果你想要0和1的表示,你應該使用格式化

+0

謝謝你。而已。 +1爲更緊湊的解決方案。 –

+0

你知道(在你的「應該」部分)charAArray [i]^charBArray [i] +'0''是指charAArray [i] ^(charBArray [i] +'0')'之前(具有更高的優先級或優先級)比按位異或? –

+0

@Jeppe Stig Nielsen:謝謝! '^'的優先級小於'+'的微妙細節從我的腦海中沉澱下來。 –

0

看一看的ASCII表。 0是空字符\ 0。你可以嘗試ToString()

0

你試過使用二進制/字節[]?這對我來說似乎是最快的方式。

public string calcXor(string a, string b) 
{ 
    //String to binary 
    byte[] ab = ConvertToBinary(a); 
    byte[] bb = ConvertToBinary(b); 
    //(XOR) 
    byte[] cb = a^b 

    return cb.ToString(); 
} 

public static byte[] ConvertToBinary(string str) 
{ 
    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
    return encoding.GetBytes(str); 
} 
0

我只是想補充一點,我最終還是選擇瞭解決辦法如下:

//Parameter binary is a bit string 
public void someroutine(String binary) 
{ 
var data = GetBytesFromBinaryString(binary); 
var text = Encoding.ASCII.GetString(data); 
} 

public Byte[] GetBytesFromBinaryString(String binary) 
{ 
var list = new List<Byte>(); 

for (int i = 0; i < binary.Length; i += 8) 
    { 
    String t = binary.Substring(i, 8); 
    list.Add(Convert.ToByte(t, 2)); 
    } 

return list.ToArray(); 
}