有人可以提供一些关于如何做到这一点的信息吗?我可以对常规文本或字节数组执行此操作,但不确定如何处理 pdf。我先将pdf填充到字节数组中吗?
2 回答
用于File.ReadAllBytes
加载 PDF 文件,然后使用Convert.ToBase64String(bytes)
.
有一种方法可以分块执行此操作,这样您就不必一次消耗大量内存。
.Net 包含一个可以进行分块的编码器,但它有点奇怪。他们把它放在 System.Security.Cryptography 命名空间中。
我已经测试了下面的示例代码,并且使用我的方法或上面的 Andrew 方法得到了相同的输出。
它是这样工作的:你启动了一个名为 CryptoStream 的类。这是一种插入另一个流的适配器。您将一个名为 CryptoTransform 的类插入到 CryptoStream(它又附加到您的文件/内存/网络流)中,它在从流中读取或写入数据时对数据执行数据转换。
通常,转换是加密/解密,但 .net 也包括 ToBase64 和 FromBase64 转换,所以我们不会加密,只是编码。
这是代码。我包含了 Andrew 建议的一个(可能命名不当)实现,以便您可以比较输出。
class Base64Encoder
{
public void Encode(string inFileName, string outFileName)
{
System.Security.Cryptography.ICryptoTransform transform = new System.Security.Cryptography.ToBase64Transform();
using(System.IO.FileStream inFile = System.IO.File.OpenRead(inFileName),
outFile = System.IO.File.Create(outFileName))
using (System.Security.Cryptography.CryptoStream cryptStream = new System.Security.Cryptography.CryptoStream(outFile, transform, System.Security.Cryptography.CryptoStreamMode.Write))
{
// I'm going to use a 4k buffer, tune this as needed
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inFile.Read(buffer, 0, buffer.Length)) > 0)
cryptStream.Write(buffer, 0, bytesRead);
cryptStream.FlushFinalBlock();
}
}
public void Decode(string inFileName, string outFileName)
{
System.Security.Cryptography.ICryptoTransform transform = new System.Security.Cryptography.FromBase64Transform();
using (System.IO.FileStream inFile = System.IO.File.OpenRead(inFileName),
outFile = System.IO.File.Create(outFileName))
using (System.Security.Cryptography.CryptoStream cryptStream = new System.Security.Cryptography.CryptoStream(inFile, transform, System.Security.Cryptography.CryptoStreamMode.Read))
{
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = cryptStream.Read(buffer, 0, buffer.Length)) > 0)
outFile.Write(buffer, 0, bytesRead);
outFile.Flush();
}
}
// this version of Encode pulls everything into memory at once
// you can compare the output of my Encode method above to the output of this one
// the output should be identical, but the crytostream version
// will use way less memory on a large file than this version.
public void MemoryEncode(string inFileName, string outFileName)
{
byte[] bytes = System.IO.File.ReadAllBytes(inFileName);
System.IO.File.WriteAllText(outFileName, System.Convert.ToBase64String(bytes));
}
}
我也在玩我附加 CryptoStream 的地方。在 Encode 方法中,我将它附加到输出(写入)流,所以当我实例化 CryptoStream 时,我使用它的 Write() 方法。
当我阅读时,我将它附加到输入(阅读)流,所以我使用 CryptoStream 上的 read 方法。我将它附加到哪个流并不重要。我只需要将适当的 Read 或 Write 枚举成员传递给 CryptoStream 的构造函数。