2011-05-15 16 views
5

我知道如何在C#中將字符串轉換爲byte []。在這種特殊情況下,我正在使用HMAC-SHA256密鑰的字符串表示形式。比方說,這個鍵我從一個OpenID OP得到的字符串表示:如何在不丟失完整性的情況下在字符串和字節[]之間進行轉換

"81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8=" 

我把它轉換爲byte []是這樣的:

byte[] myByteArr = Encoding.UTF8.GetBytes("81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8="); 

我對此的問題是,它似乎丟失原始數據。如果我從上一步獲取字節數組並將其轉換回字符串,則它與原始字符串不同。

string check = Convert.ToBase64String(myByteArr); 

檢查結束是:

"ODFGTnliS1dmY001Mzl2Vkd0SnJYUm1vVk14Tm1aSFkzT2dVcm84K3BaOD0=" 

這顯然是不一樣的原始字符串表示我開始。

回答

6

使用加密密鑰,始終使用Convert.FromBase64StringConvert.ToBase64String。這樣你就可以做到標準方式,並且不會由於編碼問題而丟失字節。 Base 64字符串可能不具有節約空間的優點,但它是許多方案中存儲和傳輸密鑰的首選方法。

這裏是一個快速驗證:

byte[] myByteArr = Convert.FromBase64String("81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8="); 
string check = Convert.ToBase64String(myByteArr); 
Console.WriteLine(check); 
// Writes: 81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8= 
1

您使用byte[] Encoding.GetBytes(string)和一個base64字符串解碼時得到的字節數是不一樣的東西。前者給你表示字符串的字節。然而,你想解碼一個base64字符串回到它表示的字節。在這種情況下,您想使用Convert.FromBase64String()

string encoded = "81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8="; 
byte[] decoded = Convert.FromBase64String(encoded); // this gives the bytes that the encoded string represents 
1

編碼類有一個GetString方法,將它從字節數組轉換回字符串。

如果您使用UTF8編碼創建字節數組,則應該使用相同的編碼重新獲取它。

 var original = "81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8="; 
     var byteArray = Encoding.UTF8.GetBytes(original); 
     var copy = Encoding.UTF8.GetString(byteArray); 
     bool match = (copy == original); // This returns true 
+0

我不認爲OP想要獲取字符串作爲字節,而是字符串代表的字節。 – 2011-05-15 01:43:45

2

第一個函數(Encoding.UTF8.GetBytes)需要(任何種類的)一個字符串,並返回一個byte[]表示在特定編碼該字符串 - 在你的情況,UTF8

第二個函數(Convert.ToBase64String)需要一個字節數組(任何類型)並返回一個base64格式的字符串,以便可以使用唯一的可打印字符將此二進制數據存儲在任何與ASCII兼容的字段中。

這些功能不是同行。它看起來像你得到的字符串是一個base64編碼的字符串。如果是這種情況,請使用Convert.FromBase64String獲取它代表的byte[],而不是Encoding.UTF8.GetBytes

相關問題