gpt4 book ai didi

c# - 为什么 UTF8 编码在写入文件时会更改/损坏字节而不是 Base64 和 ASCII?

转载 作者:行者123 更新时间:2023-11-30 21:43:39 29 4
gpt4 key购买 nike

我正在编写一个应用程序,它将接收加密的字节数组,其中包含文件名和文件字节,使用以下协议(protocol):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 文件,但该文件无效。它在使用 ASCIIBase64 时有效。

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);

}
}
}
}

最佳答案

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

如果您收到一些非特定的原始字节,那么 process them as raw bytes .

但为什么它有效/无效?

因为:

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

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

关于c# - 为什么 UTF8 编码在写入文件时会更改/损坏字节而不是 Base64 和 ASCII?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41533852/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com