C# 如何解码和解压文本?
我想创建大文本,压缩它,编码并保存到文件中。然后我想破译并提取文本,并将其保存到简单的文本文件中 我对第一步(创建加密和压缩文件)没有问题,但我对第二步也有问题——为了获取信息(请阅读我代码中的注释)。我做错了什么C# 如何解码和解压文本?,c#,.net,stream,C#,.net,Stream,我想创建大文本,压缩它,编码并保存到文件中。然后我想破译并提取文本,并将其保存到简单的文本文件中 我对第一步(创建加密和压缩文件)没有问题,但我对第二步也有问题——为了获取信息(请阅读我代码中的注释)。我做错了什么 using System; using System.IO; using System.Text; using System.IO.Compression; using System.Security.Cryptography; static class Program {
using System;
using System.IO;
using System.Text;
using System.IO.Compression;
using System.Security.Cryptography;
static class Program
{
static void Main()
{
Console.WriteLine("Create encrypted archive...");
var fileName = @"data.xgzip";
byte[] key = null;
byte[] iv = null;
// I want to create big text, squeeze it, encode and save into file:
// 1. Create big text.
// 2. Squeeze text.
// 3. Encode squeezed text.
// 4. Write result to file.
using (var stream = new FileStream(fileName, FileMode.Create,
FileAccess.Write, FileShare.None, 0x1000, FileOptions.None))
{
using (var rijn = Rijndael.Create())
{
key = rijn.Key;
iv = rijn.IV;
var encryptor = rijn.CreateEncryptor(key, iv);
using (var encStream = new CryptoStream(stream, encryptor,
CryptoStreamMode.Write))
{
using (var zip = new DeflateStream(encStream,
CompressionLevel.Optimal))
{
using (var writer = new StreamWriter(zip, new UTF8Encoding(
encoderShouldEmitUTF8Identifier: false,
throwOnInvalidBytes: true), 0x1000, true))
{
var text = "One, two, three, four, five...";
for (int n = 0; n < 1000; n++)
{
writer.WriteLine(text);
}
}
Console.WriteLine("zip.Length = {0}", stream.Length);
}
}
}
}
var fi = new FileInfo(fileName);
Console.WriteLine("File size: {0}", fi.Length);
// Now I want to decipher and extract my file into simple text file.
// 1. Decode squeezed data.
// 2. Unpack decoded data.
// 4. Write result to text file.
Console.WriteLine("Extract encrypted archive...");
var fileName2 = @"data.txt";
using (var stream = new FileStream(fileName, FileMode.Open,
FileAccess.Read, FileShare.None, 0x1000, FileOptions.None))
{
using (var rijn = Rijndael.Create())
{
var encryptor = rijn.CreateEncryptor(key, iv);
using (var cryptoStream = new CryptoStream(stream, encryptor,
CryptoStreamMode.Read))
{
using (var zip = new DeflateStream(cryptoStream,
CompressionMode.Decompress))
{
using (var reader = new StreamReader(zip,
new UTF8Encoding(encoderShouldEmitUTF8Identifier: false,
throwOnInvalidBytes: true)))
{
// System.IO.InvalidDataException:
// "The archive entry was compressed using an unsupported
// compression method."
var text = reader.ReadToEnd();
// Write the result into the simple text file.
using (var stream2 = new FileStream(fileName2,
FileMode.Create, FileAccess.Write, FileShare.None,
0x1000, FileOptions.None))
{
using (var writer = new StreamWriter(stream2,
new UTF8Encoding(encoderShouldEmitUTF8Identifier: false,
throwOnInvalidBytes: true), 0x1000, true))
{
writer.Write(text);
}
Console.WriteLine("stream.Length = {0}", stream.Length);
}
}
}
}
}
}
var fi2 = new FileInfo(fileName2);
Console.WriteLine("File size: {0}", fi2.Length);
Console.WriteLine("Press any key for exit...");
Console.ReadKey();
}
}
使用系统;
使用System.IO;
使用系统文本;
使用系统IO压缩;
使用System.Security.Cryptography;
静态类程序
{
静态void Main()
{
WriteLine(“创建加密存档…”);
var fileName=@“data.xgzip”;
字节[]键=空;
字节[]iv=空;
//我想创建大文本,压缩它,编码并保存到文件中:
//1.创建大文本。
//2.压缩文本。
//3.对压缩文本进行编码。
//4.将结果写入文件。
使用(var stream=newfilestream)(文件名,FileMode.Create,
FileAccess.Write,FileShare.None,0x1000,FileOptions.None)
{
使用(var rijn=Rijndael.Create())
{
key=rijn.key;
iv=rijn.iv;
var encryptor=rijn.CreateEncryptor(密钥,iv);
使用(var encStream=新加密流(流、加密器、,
CryptoStreamMode.Write)
{
使用(var zip=new DeflateStream(encStream,
压缩水平(最佳)
{
使用(var writer=newstreamwriter(zip,新UTF8编码(
编码器应提交F8标识符:false,
throwOnInvalidBytes:true),0x1000,true)
{
var text=“一、二、三、四、五…”;
对于(int n=0;n<1000;n++)
{
writer.WriteLine(文本);
}
}
WriteLine(“zip.Length={0}”,stream.Length);
}
}
}
}
var fi=新文件信息(文件名);
WriteLine(“文件大小:{0}”,fi.Length);
//现在我想把我的文件解密并解压缩成简单的文本文件。
//1.解码压缩数据。
//2.解包解码数据。
//4.将结果写入文本文件。
WriteLine(“提取加密存档…”);
var fileName2=@“data.txt”;
使用(var stream=newfilestream)(文件名,FileMode.Open,
FileAccess.Read,FileShare.None,0x1000,FileOptions.None)
{
使用(var rijn=Rijndael.Create())
{
var encryptor=rijn.CreateEncryptor(密钥,iv);
使用(var cryptoStream=新加密流(流、加密器、,
CryptoStreamMode.Read)
{
使用(var zip=new DeflateStream(cryptoStream,
压缩模式(解压缩模式)
{
使用(var reader=newstreamreader(zip、,
新的UTF8Encoding(编码器应指定UTF8Identifier:false,
throwOnInvalidBytes:true)))
{
//System.IO.InvalidDataException:
//“存档项是使用不受支持的
//压缩方法。”
var text=reader.ReadToEnd();
//将结果写入简单文本文件。
使用(var stream2=newfilestream(fileName2,
FileMode.Create,FileAccess.Write,FileShare.None,
0x1000,文件选项。无)
{
使用(var writer=newstreamwriter(stream2,
新的UTF8Encoding(编码器应指定UTF8Identifier:false,
throwOnInvalidBytes:true),0x1000,true)
{
作者:写(文本);
}
WriteLine(“stream.Length={0}”,stream.Length);
}
}
}
}
}
}
var fi2=新文件信息(fileName2);
WriteLine(“文件大小:{0}”,fi2.Length);
Console.WriteLine(“按任意键退出…”);
Console.ReadKey();
}
}
在解码部分,您仍在使用加密程序对内容进行解密,正确的方法应该是使用解密程序
更新解码部分中的以下行
var encryptor = rijn.CreateEncryptor(key, iv);
using (var cryptoStream = new CryptoStream(stream, encryptor,
CryptoStreamMode.Read))
到
然后,您的代码应该可以在解码部分工作,您仍然在使用加密程序对内容进行解密,正确的方法应该是使用解密程序 更新解码部分中的以下行
var encryptor = rijn.CreateEncryptor(key, iv);
using (var cryptoStream = new CryptoStream(stream, encryptor,
CryptoStreamMode.Read))
到
那么你的代码应该可以工作了