如何在字符串和byte []之间进行转换而不会丢失完整性

时间:2011-05-15 01:30:17

标签: c# openid

我知道如何在C#中将字符串转换为byte []。在这种特殊情况下,我正在使用HMAC-SHA256密钥的字符串表示。假设我从OpenID OP得到的这个密钥的字符串表示是:

"81FNybKWfcM539vVGtJrXRmoVMxNmZHY3OgUro8+pZ8="

我将它转换为byte [],如下所示:

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

我遇到的问题是它似乎丢失了原始数据。如果我从上一步获取字节数组并将其转换回字符串,则它与原始字符串不同。

string check = Convert.ToBase64String(myByteArr);

检查结束:

"ODFGTnliS1dmY001Mzl2Vkd0SnJYUm1vVk14Tm1aSFkzT2dVcm84K3BaOD0="

这显然与我开始使用的原始字符串表示不同。

4 个答案:

答案 0 :(得分:6)

使用加密密钥时,请始终使用Convert.FromBase64StringConvert.ToBase64String。这样你就可以采用标准方式,并且不会因编码问题而丢失字节。 Base 64字符串可能不具有空间效率,但它是许多方案中存储和传输密钥的首选方法。

以下是快速验证:

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

答案 1 :(得分:2)

第一个函数(Encoding.UTF8.GetBytes)接受一个字符串(任何类型)并返回一个byte[],表示特定编码中的字符串 - 在您的情况下为UTF8。< / p>

第二个函数(Convert.ToBase64String)接受一个字节数组(任何类型)并返回base64格式的字符串,以便您可以使用仅可打印字符将此二进制数据存储在任何ASCII兼容字段中。

这些功能不是对应的。看起来你得到的字符串是base64编码的字符串。如果是这种情况,请使用Convert.FromBase64String获取其代表的byte[],而不是Encoding.UTF8.GetBytes

答案 2 :(得分: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

答案 3 :(得分: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