2009-08-20 89 views
2

我有以下代碼:從字節[]轉換爲串

using (BinaryReader br = new BinaryReader(
     File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite))) 
{ 
    int pos = 0; 
    int length = (int) br.BaseStream.Length; 

    while (pos < length) 
    { 
     b[pos] = br.ReadByte(); 
     pos++; 
    } 

    pos = 0; 
    while (pos < length) 
    { 
     Console.WriteLine(Convert.ToString(b[pos])); 
     pos++; 
    } 
} 

的FILE_PATH是正被讀取包含該路徑二進制文件常量字串。 二進制文件是整數和字符的混合。 整數爲1個字節,每個字符以2個字節寫入文件。

例如,文件中有如下數據:

1HELLO HOW ARE YOU45YOU正在尋找偉大//等

請注意:每個整數與字符的它後面的字符串相關聯。所以1與「你好嗎」和45「你看起來很棒」等相關。

現在二進制寫入(我不知道爲什麼,但我不得不忍受這一點),使得「1」將只需要1個字節,而「H」(和其他字符)都需要2個字節。

因此,這裏是什麼文件實際上包含:

0100480045..and等 繼承人的故障:

01是整數1 0048的第一個字節是「小時2個字節'(H是48進制) 0045是用於2個字節‘E’(E = 0×45)

等.. 我希望我的控制檯打印人類可讀的格式出此文件的:即我想它打印出「1 HELLO HOW ARE YOU」,然後「45你看起來很棒」等等。 。

是我在做什麼正確的嗎?有一種更簡單/有效的方法嗎? 我的行Console.WriteLine(Convert.ToString(b [pos]));什麼都不做,只是打印整數值而不是我想要的實際字符。文件中的整數是可以的,但是如何讀出字符?

任何幫助將不勝感激。 感謝

+0

語言? – mkoryak 2009-08-20 21:44:03

+0

我刪除了我的答案 - 那個人認爲是誰決定了這種格式? :boggled: – 2009-08-20 21:47:19

+0

整數域如何與字符串區分?字符可以在代碼點U + 00FF之上嗎?整數是「0」嗎?整數是有符號還是無符號? – outis 2009-08-20 22:06:58

回答

8

我想你在找什麼是Encoding.GetString

由於您的字符串數據由2個字節的字符,你怎麼可以讓你的字符串的是:

for (int i = 0; i < b.Length; i++) 
{ 
    byte curByte = b[i]; 

    // Assuming that the first byte of a 2-byte character sequence will be 0 
    if (curByte != 0) 
    { 
    // This is a 1 byte number 
    Console.WriteLine(Convert.ToString(curByte)); 
    } 
    else 
    { 
    // This is a 2 byte character. Print it out. 
    Console.WriteLine(Encoding.Unicode.GetString(b, i, 2)); 

    // We consumed the next character as well, no need to deal with it 
    // in the next round of the loop. 
    i++; 
    } 
} 
+0

你需要分別讀取第一個「ID」字節,然後翻譯使用正確的編碼字節的其餘部分。 – tvanfosson 2009-08-20 21:50:55

+0

哦,我錯過了這個問題。我會編輯我的答案。 – paracycle 2009-08-20 21:58:12

+0

代碼如何確定第一個字符串的結束位置?沒有這些信息,你不會知道何時搜索下一個號碼。 – 2009-08-20 22:15:23

1

您可以使用字符串System.Text.UnicodeEncoding.GetString(),接受一個byte []數組並生成一個字符串。 I found this link very useful

+0

你真的應該添加一個總結,以便你的答案可以獨立。這不是我的失望,但我當然可以理解爲什麼有人認爲這沒有幫助。 – tvanfosson 2009-08-20 21:51:59

0
using (BinaryReader br = new BinaryReader(File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite))) 
{  
    int length = (int)br.BaseStream.Length;  

    byte[] buffer = new byte[length * 2]; 
    int bufferPosition = 0; 

    while (pos < length)  
    {   
     byte b = br.ReadByte();   
     if(b < 10) 
     { 
      buffer[bufferPosition] = 0; 
      buffer[bufferPosition + 1] = b + 0x30; 
      pos++; 
     } 
     else 
     { 
      buffer[bufferPosition] = b; 
      buffer[bufferPosition + 1] = br.ReadByte(); 
      pos += 2; 
     } 
     bufferPosition += 2;  
    }  

    Console.WriteLine(System.Text.Encoding.Unicode.GetString(buffer, 0, bufferPosition)); 

}

+1

我在線緩衝區[bufferPosition + 1] = b + 0x30嘗試使用代碼時遇到以下編譯器錯誤; : 錯誤CS0266:不能將類型'int'隱式轉換爲'byte'。存在明確的轉換(您是否缺少演員?) – zack 2009-08-21 01:05:59

+0

另外我檢查了長度變量的值。它包括了零的數量。所以我不認爲這需要像你所做的那樣最初乘以2。 – zack 2009-08-21 01:11:18

+0

對不起,我忘了投十六進制值,那行應該是 buffer [bufferPosition + 1] = b +(byte)0x30; 但是,您需要將緩衝區長度乘以2,因爲如果整個輸入爲整數,則數組的整體大小可以加倍 – LorenVS 2009-08-21 14:08:35