2011-05-15 22 views
5

C# biçimindeki bir dize ile bayt arasında nasıl dönüştürüleceğini biliyorum. Bu özel durumda, bir HMAC-SHA256 anahtarının dize gösterimi ile çalışıyorum.Dize ve bayt [] arasında bütünlük kaybetmeden dönüştürme nasıl yapılır

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

görünüyor ben bu konuda var sorun olduğunu: Böyle o [] bayt dönüştürmek

"81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8=" 

: ı OpenID OP'sinden olsun bu anahtarın dize temsilidir diyelim Orijinal verileri kaybetmek. Bir önceki adımdan bayt dizisini alıp bir dizeye geri döndürürsem, orijinal dizeden farklı olur. Açıkçası ben ile başladı orijinal dize temsili olarak aynı değildir

"ODFGTnliS1dmY001Mzl2Vkd0SnJYUm1vVk14Tm1aSFkzT2dVcm84K3BaOD0=" 

:

string check = Convert.ToBase64String(myByteArr); 

onay varlık biter.

cevap

6

Kripto tuşları ile her zaman Convert.FromBase64String ve Convert.ToBase64String kullanın. Bu şekilde standart yol yapacaktır ve kodlama sorunları nedeniyle bayt kaybetmezsiniz. Temel 64 dizgi, alan etkili olmayabilir, ancak birçok şemada anahtarların saklanması ve taşınması için tercih edilen yöntemdir.

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

byte[] Encoding.GetBytes(string) kullanarak ve base64 dize kod çözme aldığınız bayt aynı şeyler değildir: Burada

hızlı bir doğrulama olduğunu. İlki, dizeyi temsil eden baytları size verir. Bununla birlikte, kodunu bir base64 dizesini temsil ettiği baytlara geri döndürmek istiyorsunuz. Bu durumda Convert.FromBase64String()'u kullanmak istiyorsunuz.

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

kodlama sınıfları geri dizgeye bir bayt dizisi dönüştürülmesi için, bir GetString yöntemi vardır.

Bayt dizisini oluşturmak için UTF8 kodlamasını kullandıysanız, tekrar almak için aynı kodlamayı kullanmanız gerekir.

 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'nin dizeyi bayt olarak değil, dizenin temsil ettiği bayt olarak almak istediğini sanmıyorum. –

2

birinci fonksiyonu (Encoding.UTF8.GetBytes) (her türlü) bir dize alır ve belirli bir kodlamada bu dizeyi temsil eden bir byte[] döndürür - Senin durumunda, UTF8 içinde.

İkinci işlev (Convert.ToBase64String) bir bayt dizisini (herhangi bir türde) alır ve base64 biçiminde bir dize döndürür, böylece bu ikili verileri yalnızca yazdırılabilir karakterler kullanarak ASCII uyumlu bir alanda saklayabilirsiniz.

Bu işlevler karşı taraf değildir. Aldığınız dize base64 kodlu bir dize gibi görünüyor. Durum buysa, numarasını, Encoding.UTF8.GetBytes değil, Convert.FromBase64String kullanın.

İlgili konular