[英]Problems with converting char array to string
我在編寫的一個小型應用程序中有一個功能,用於破壞回收的一次性填充密碼。 在我職業生涯的大部分時間里都使用VB.NET,我認為用C#實現該應用程序會很有趣。 但是,由於我現在不熟悉C#,因此遇到了問題。
該函數接收兩個字符串(二進制數字),將這些字符串轉換為char數組,然后對其進行XOR運算,然后將結果放入第三個char數組中。
這很好,直到我嘗試將第三個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);
}
你的問題就在這里
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();
}
您的解決方案只計算xor(例如“ 65”),然后將它們放在一起(例如65728 ...); 如果要用0和1表示,則應使用格式
看一下ASCII表。 0是空字符\\ 0。 您可以嘗試ToString()
您是否嘗試過使用二進制/字節[]? 這似乎是我最快的方法。
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);
}
我只是想補充一點,我最終選擇的解決方案如下:
//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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.