用于将Bytes数组转换为String的编码,反之亦然

时间:2011-11-03 14:51:59

标签: c# string encoding bytearray

我使用此代码加密字符串(基本上,这是Rijndael class on MSDN上给出的示例):

public static String AESEncrypt(String str2Encrypt, Byte[] encryptionKey, Byte[] IV)
{
    Byte[] encryptedText;

    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        // Use the provided key and IV
        rijAlg.Key = encryptionKey;
        rijAlg.IV = IV;

        // Create a decrytor to perform the stream transform
        ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);

        // Create the streams used for encryption
        using (MemoryStream msEncrypt = new MemoryStream())
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
        {
            using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
            {
                // Write all data to the stream
                swEncrypt.Write(str2Encrypt);
            }

            encryptedText = msEncrypt.ToArray();
        }
    }

    return Encoding.Default.GetString(encryptedText);
}

我使用Encoding.Default将字节数组转换为字符串,但我不确定这是一个很好的解决方案。我的目标是将加密文本(例如密码......)存储在文件中。我应该继续Encoding.Default还是使用Encoding.UTF8Encoding或其他?

如果将文件移动到不同的操作系统上,当我尝试加密和解密时,这会对存储的值产生负面影响吗?

4 个答案:

答案 0 :(得分:46)

绝对不使用Encoding将任意二进制数据转换为文本。 Encoding用于获得真正编码文本的二进制数据 - 这不是。

相反,使用Convert.ToBase64String将二进制数据编码为文本,然后使用Convert.FromBase64String进行解码。

答案 1 :(得分:0)

是的,Encoding.Default是您机器当前的ANSI代码页,在多台机器/区域设置之间可能会有所不同。如果数据是文本数据并使其可移植,则需要使用固定的编码格式,例如UTF8。

但是,由于您的数据不是文本数据,因此您无法尝试使用任何文本编码转换为字符串。最好的选择是使用十六进制或Base64编码或将其保存为blob / byte数组。

答案 2 :(得分:0)

如果您的目标是将加密的信息存储在文件中,并且您有一个字节数组,则应直接存储它-完全不要将其转换为字符串。例如,在C#中您可以使用File.WriteAllBytes直接将字节数组写入文件。请记住,文件保存的是字节,而不是字符串(如果您将字符串写入文件,则即使您使用的技术未明确引用{,也会使用某种Encoding来将其转换为字节)。 {1}}。

如果您实际上需要将字节数组存储为字符串(例如,因为它将存储在JSON中),那么最常见的技术是将base64与Encoding一起使用,如乔恩(Jon)所述。

(在非加密应用程序中,您可能有一个Convert.ToBase64String,其中包含ASCII和二进制数据的混合,并且您希望将其转换为字符串。在这种情况下,base64可以正常工作,但它可以隐藏文本-字节字符串格式的数组类似于base64,除了保留ASCII的运行-C# version在Loyc.Essentials NuGet软件包中,Java版本here

答案 3 :(得分:-1)

我不是100%肯定在这里,但我认为Encoding.Default是指系统默认编码,是的,可以从系统更改为系统..

如果我在哪里,我会使用UTF8或其他一些不会因系统而异的编码..

有关扩展ascii的更多信息,请点击此处

http://en.wikipedia.org/wiki/Extended_ASCII