与 Base64 和 ASCII 不同,在写入文件时,为什么 UTF8 编码会更改/损坏字节?

3 c# encoding utf-8

我正在编写一个应用程序,它将接收加密的字节数组,其中包含文件名和文件字节,使用以下协议:file_name_and_extension|bytes。然后对字节数组进行解密并传入Encoding.UTF8.getString(decrypted_bytes)会更好,因为我想file_name_and_extension从接收到的字节中进行修剪以将实际文件字节保存到file_name_and_extension.

我简化了我的应用程序,只接收文件,bytes然后Encoding.UTF8.GetString()使用Encoding.UTF8.getBytes(). 之后,我尝试编写一个 zip 文件,但该文件无效。它在使用ASCII或时有效Base64

private void Decryption(byte[] encryptedMessage, byte[] iv)
{
    using (Aes aes = new AesCryptoServiceProvider())
    {
        aes.Key = receiversKey;
        aes.IV = iv;
        // Decrypt the message
        using (MemoryStream decryptedBytes = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(decryptedBytes, aes.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(encryptedMessage, 0, encryptedMessage.Length);
                cs.Close();

                string decryptedBytesString = Encoding.UTF8.GetString(decryptedBytes.ToArray()); //corrupts the zip
                //string decryptedBytesString = Encoding.ASCII.GetString(decryptedBytes.ToArray()); //works
                //String decryptedBytesString = Convert.ToBase64String(decryptedBytes.ToArray()); //works

                byte[] fileBytes = Encoding.UTF8.GetBytes(decryptedBytesString);
                //byte[] fileBytes = Encoding.ASCII.GetBytes(decryptedBytesString);
                //byte[] fileBytes = Convert.FromBase64String(decryptedBytesString);
                File.WriteAllBytes("RECEIVED\\received.zip", fileBytes);

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Eug*_*kal 5

因为人们不应该尝试将原始字节解释为某种编码中的符号,除非他实际上知道/可以推断出所使用的编码。

如果您收到一些非特定的原始字节,则将它们作为原始字节处理

但为什么它有效/无效?

因为:

  1. Encoding.Ascii 似乎会忽略大于 127 的值并按原样返回它们。因此,无论进行何种编码/解码,原始字节都是相同的。
  2. Base64 是一种简单的编码,不会以任何方式改变原始数据。
  3. UTF8 - 理论上,如果这些字节不是正确的 UTF8 字符串,我们可能会丢失一些转换数据(尽管它更有可能导致异常)。但最可能的原因是在调用期间添加了 BOMEncoding.UTF8.GetString,该 BOM 在调用后仍保留在那里Encoding.UTF8.GetBytes

无论如何,我重复一遍 - 不要编码/解码任何内容,除非它实际上是字符串数据/所需的格式。