2012-10-09 62 views
1

我試圖將字節[]轉換爲字符串,並使用Encoding.Unicode進行轉換。 有時Encoding.Unicode能夠將byte []轉換爲字符串,有時輸出是!=輸入。 我在做什麼錯?將字節[]轉換爲字符串並返回c#

感謝您的幫助。

public static void Main(string[] args) 
{ 
    Random rnd = new Random(); 
    while(true) 
    { 
     Int32 random = rnd.Next(10, 20); 
     Byte[] inBytes = new Byte[random]; 
     for(int i = 0; i < random; i++) 
      inBytes[i] = (Byte)rnd.Next(0, 9); 

     String inBytesString = Encoding.Unicode.GetString(inBytes, 0, inBytes.Length); 
     Byte[] outBytes = Encoding.Unicode.GetBytes(inBytesString); 

     if(inBytes.Length != outBytes.Length) 
      throw new Exception("?"); 
     else 
     { 
      for(int i = 0; i < inBytes.Length; i++) 
      { 
       if(inBytes[i] != outBytes[i]) 
        throw new Exception("?"); 
      } 
     } 
     Console.WriteLine("OK"); 
    } 
} 
+3

嗯,輸出一些隨機字節數組不會是有效的Unicode,所以,有時這是不行的。如果你從一個隨機字符串開始,並通過一個字節數組往返,那麼它每次都會工作。 – Jodrell

+2

[絕對最低限度每個軟件開發人員絕對,肯定必須知道Unicode和字符集(沒有藉口!)](http://www.joelonsoftware.com/articles/Unicode.html) –

回答

6

不能使用的編碼爲:必須使用類似Convert.ToBase64String/Convert.FromBase64String。

編碼假定字節[]根據特定規則進行格式化,而對於隨機非字符串字節[]則不是這種情況。

總結:

的編碼變成一個任意字符串向/從一個格式化的字節[]

BASE-64接通一個任意字節[]向/從一個格式化的字符串

+0

Thx。您的解決方案完美運作 – musium

0
you cannot use encoding use base64 

使用base64 u能字節安全地轉換爲字符串和背部

base64 guaranteed to not to get "invalid" unicode sequences,如:
代理對的前半部分而沒有第二半 使用這樣的:

string base64 = Convert.ToBase64String(bytes); 
byte[] bytes = Convert.FromBase64String(base64); 
+0

嚴格來說,base64是一種編碼。 – Jodrell

0

這裏就是我改變和圖像的位陣列,然後將它轉換回來爲可讀的字符串的示例。

protected bool isImageCMYK(HttpPostedFile image, Stream fileContent) 
    { 
      //creating byte array 
     byte[] imageToByteArray = new byte[image.ContentLength]; 

      //filling the byte array 
     fileContent.Read(imageToByteArray, 0 , image.ContentLength); 

      //convering byte array back to a readable string 
     UTF8Encoding byteToString = new UTF8Encoding(); 
     string imageString = byteToString.GetString(imageToByteArray); 

     return imageString.ToLower().Contains("cmyk"); 
    } 

這裏是編輯的代碼,導致「OK」

public static void Main(string[] args) 
     { 
      Random rnd = new Random(); 
      while (true) 
      { 
       Int32 random = rnd.Next(10, 20); 
       Byte[] inBytes = new Byte[random]; 
       for (int i = 0; i < random; i++) 
        inBytes[i] = (Byte)rnd.Next(0, 9); 

       UTF8Encoding inBytesString = new UTF8Encoding(); 
       string byteString = inBytesString.GetString(inBytes, 0, inBytes.Length); 
       //Byte[] outBytes = Encoding.Unicode.GetBytes(inBytesString); 
       Byte[] outBytes = inBytesString.GetBytes(byteString); 

       if (inBytes.Length != outBytes.Length) 
        throw new Exception("?"); 
       else 
       { 
        for (int i = 0; i < inBytes.Length; i++) 
        { 
         if (inBytes[i] != outBytes[i]) 
          throw new Exception("?"); 
        } 
       } 
       Console.WriteLine("OK"); 
      } 
+0

如果傳入的數據是二進制數據(而不是UTF8數據),這不是有效的實現。如果數據是UTF-8文本(或ASCII文本),則這是* only * correct **。 –

+0

對,如果你使用上面的整數,你應該沒問題吧? –

+0

整數如何?整數值的字符串?整數編碼爲二進制?如果是這樣,什麼編碼? 4字節LE? 4字節BE? 「varint」?還有別的嗎? –