2013-11-23 76 views
0

我想將一個byte數組指向一個字符串,我需要的只是將byteArray中的數字轉換爲字符串Foreg。 "12459865..."正確的編碼風格爲轉換字節[]到字符串

我想這個要做到這一點:

fileInString = Encoding.UTF8.GetString(fileInBytes, 0, fileInBytes.Length); 

fileInBytes看起來是這樣的:1212549878563212450045.... 但最終fileInString看起來像這樣ID3\0\0\0\0JTENC\0\0\[email protected]\0\0WXXX\0...和怪異cahracters的很多。

我嘗試了不同的Encoding樣式,包括default,但是都插入了一些需要的字符。

我唯一的選擇就是循環和每個成員投在串

while (currbyte != -1) 
{ 
    currbyte = fileStream.ReadByte(); 
    //fileInBytes[i++] = (byte)currbyte; 
    fileInString += currbyte.ToString(); 
    progressBar1.Value = i++; 
} 

但這是TOO緩慢。請告訴我,我怎麼可以轉換字節數組使用Encoding.....GetString

+0

你如何讓你的字節LIK這個'1212549878563212450045'?你能把它分成每個字節嗎?如12 | 12 | 54 | 98 ...或1 | 2 | 1 | 2 | 5 | 4 | 9 | 8 ...? –

+0

我已經更新了我的問題來解釋我是如何做到的'fileInBytes'陣列的一個喜歡這裏'fileInBytes [我++] =(字節)currbyte基本上;' – Maven

+0

它很慢,也許部分原因在於你的'progressBar1.Value =我++;',任何與UI更新相關的代碼都會減慢一切,你應該在更大的時間間隔內更新進度條以減少這種情況,甚至在某些情況下,我們甚至不需要關於當前進程的確切信息,只需要一些工作通知即可。 –

回答

1

字符串如果你想編碼byte[]stringbase64 encoding用的ConvertToBase64StringFromBase64String方法是做到這一點的好辦法:

string fileInString = Convert.ToBase64String(fileInBytes); 
byte[] asBytesAgain = Convert.FromBase64String(fileInString); 

使用fileInString += currbyte.ToString();的編碼看起來是一個模糊的base 10編碼。例如。從我所知道的情況來看,具有值{ 1, 10, 255 }{ 110, 255 }的數組將被編碼爲相同的:"110255",因此不能毫無疑義地變回byte[]

+0

你的作品很好。 :) 謝謝 – Maven

0

沒有編碼可以實現你想要的。

您需要循環遍歷字節。 爲了使其更快,使用StringBuilder,不要過於頻繁地更新進度:

var builder = new StringBuilder(); 

for (var i = 0; i < fileStream.Length; i++) 
{ 
    builder.Append(fileStream.ReadByte().ToString()); 

    if (i % 1000 == 0) //update the ProgressBar every 1000 bytes for example 
    { 
     progressBar.Value = i; 
    } 
} 

var result = builder.ToString(); 
0

好吧,既然你是指一個字節數組,fileInBytes真的不能像「1212549878563212450045」,而是像這樣:

{byte[22]} 
    [0]: 1 
    [1]: 2 

    etc. 

如果情況確實如此,你應該使用StringBuilder的能fileInString如下:

StringBuilder sb = new StringBuilder(); 
foreach (var b in fileInBytes) 
{ 
    sb.Append(b.ToString()); 
} 
fileInString = sb.ToString();