2009-12-31 214 views
2

忽略的原因,爲什麼會有人想這樣做.... :)字節[]將字符串轉換爲字節[] - 如何操作?

我希望能夠採取一些字節,它們隱蔽爲一個字符串,然後再回到相同字節數組。一樣的長度和一切。我試過使用ASCIIEncoder類(僅適用於文本文件)和Unicode編碼器類(只適用於數組1024 * n大,我認爲這是因爲每個字符的長度相等),沒有成功。

有沒有簡單的方法來做到這一點?我想我應該寫我自己的功能來做這件事吧?

回答

5

使用Base64編碼。雖然這不是空間效率。

string s = Convert.ToBase64String(byteArray); 
byte[] decoded = Convert.FromBase64String(s); 
+0

謝謝!謝謝! :D 我試圖自己寫的解決方案非常慢...... – bobber205

2

Base64在這樣的問題上很出色。

string str = Convert.ToBase64String(inArray); 
... 
byte[] ourArray = Convert.FromBase64String(str); 

請注意,結果字符串將比原始數組更大(當然)。

1

如果你知道你的字符串的編碼(我猜它是UTF8),那麼只需使用的編碼類:

Encoding.UTF8.GetBytes 
Encoding.UTF8.GetString 

編碼類可以在System.Text命名空間中找到

Y.

+0

byte []數組正在從文件中讀取,所以我不知道它的編碼。 – bobber205

1

如果您不介意將每個8位字節存儲到16位字符所需的空間翻倍並且您不需要字符串由可打印字符組成, LD做了直接的方法:

string BytesToString(byte[] b) 
{ 
    StringBuilder s;  

    s = new StringBuilder(b.Length); 
    for (int i = 0; i < b.Length; i++) 
     s[i] = (char) b[i]; // Cast not really needed 
    return s.ToString(); 
}  

byte[] StringToBytes(string s) 
{ 
    byte[] b;  

    b = new byte[s.Length]; 
    for (int i = 0; i < b.Length; i++) 
     b[i] = (byte) s[i]; 
    return b; 
} 

您可以編寫更復雜的代碼,收拾兩個8位字節到每個16位的Unicode字符,但你不得不處理單字節數組的特殊情況長度(可以在最後一個字符中使用額外的哨兵字節)。

+0

我只用普通的字符串和+運算符就試過這個方法。生氣慢了。那是因爲我沒有使用StringBuilder(就像我通常那樣)? – bobber205

+0

是的。通常,每個'+'操作符都涉及到創建一個新的臨時'StringBuilder'對象,用部分構建的字符串初始化它,追加下一個字符,這通常會導致'StringBuilder'中的內部緩衝區數組被重新分配和複製(再次)。這發生在每個循環迭代中。所以,是的,這通常是一種非常緩慢的方式。使用一個明確的'StringBuilder'來分配足夠大的緩衝區消除了所有這些開銷。 –