2011-06-01 34 views
3

我有我使用的東西轉換像一個文本框:將字節從文本框轉換爲字節數組到字符時出現奇怪的行爲?

74 00 65 00 73 00 74 00 

回字符串,上面寫着「測試」,但由於某種原因,當我點擊轉換按鈕,將顯示只有第一個字母「 t「74 00和其他字節數組正如預期的那樣工作,整個文本被轉換。

這裏是2碼我試圖其產生的整個字節數組不能正確轉換回字相同的行爲:

byte[] bArray = ByteStrToByteArray(iSequence.Text); 
ASCIIEncoding enc = new ASCIIEncoding(); 
string word = enc.GetString(bArray); 
iResult.Text = word + Environment.NewLine; 

它使用該函數:

private byte[] ByteStrToByteArray(string byteString) 
{ 
    byteString = byteString.Replace(" ", string.Empty); 
    byte[] buffer = new byte[byteString.Length/2]; 
    for (int i = 0; i < byteString.Length; i += 2) 
     buffer[i/2] = (byte)Convert.ToByte(byteString.Substring(i, 2), 16); 
    return buffer; 
} 

另一種方式我正在使用的是:

string str = iSequence.Text.Replace(" ", ""); 
byte[] bArray = Enumerable.Range(0, str.Length) 
          .Where(x => x % 2 == 0) 
          .Select(x => Convert.ToByte(str.Substring(x, 2), 16)) 
          .ToArray(); 
ASCIIEncoding enc = new ASCIIEncoding(); 
string word = enc.GetString(bArray); 
iResult.Text = word + Environment.NewLine; 

嘗試檢查的長度,看看它是否iteratrat通過和它是...

不知道如何調試爲什麼這是發生在上述字節數組,但所有其他字節數組似乎工作得很好只有這一個只輸出第一個字母的。

我做了什麼錯誤,可能會產生這種行爲一些如何? 我可以嘗試什麼以找出哪些問題?

回答

9

如果你有字節序列

var bytes = new byte[] { 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00 }; 

和你進行譯碼後,使用ASCII編碼(Encoding.ASCII)的字符串,那麼你得到

var result = Encoding.ASCII.GetString(bytes); 
// result == "\x74\x00\x65\x00\x73\x00\x74\x00" == "t\0e\0s\0t\0" 

通知的空\0字符?在文本框中顯示這樣的字符串時,只顯示字符串的一部分,直到顯示第一個空字符。

既然你說結果應該是"test",那麼輸入實際上不是用ASCII編碼,而是用UTF-16LE(Encoding.Unicode)編碼。

var result = Encoding.Unicode.GetString(bytes); 
// result == "\u0074\u0065\u0073\u0074" == "test" 
+0

感謝了很多解釋什麼,我試圖做的,爲什麼它不能正常工作。 – Prix 2011-06-01 03:32:23

1

您將unicode字符串轉換爲ascii,您沒有指定機器上的代碼頁進行轉換。 System.Text.Encoding.GetEncoding("codepage").GetString() 如果我的記憶爲我服務正確。另外值得注意的是,.NET中的任何控件都是unicode ... Soooooo ....你想要在文本框中保留的東西(如果轉換是正確的)可能是行尾字符..或eof或任何類型的控制角色。全部取決於你的代碼頁。

0

我試着在VS2010中使用斷點調試第一個程序。我發現,行

string word = enc.GetString(bArray); 

輸出爲 「T \ 0E \ 0 \0噸」。

最後一行

iResult.Text = word + Environment.NewLine; 

iResult.Text爲簡單的 「牛逼」。

所以我在想從\ 0是不是一個有效的轉義序列,編譯器忽略它後面的一切。可能是錯誤的,但嘗試刪除輸入字符串中的所有匹配項。

我不是真的進入C#。我只是建議這個,因爲它看起來像C++。

+0

'\ 0'是C#中一個有效的轉義序列。編譯時不是編譯器,而是在運行時顯示字符串時的TextBox。刪除'\ 0'字符只修復症狀,而不是原因(這是一個字符集問題)。對不起,但你的答案几乎完全錯誤。 – dtb 2011-06-01 04:20:18

0

它爲我的作品:

string outputText = "t\0e\0s\0t"; 
outputText = outputText.Replace("\0", " "); 
相關問題