Birisi bunun nasıl yapılacağı konusunda biraz bilgi verebilir mi? Bunu normal metin veya bayt dizisi için yapabilirim, ancak bir pdf'ye nasıl yaklaşacağımı bilmiyorum. pdf'yi önce bayt dizisine mi ekledim?Base64 PDF'yi C# olarak kodlayın?
cevap
PDF dosyasını yüklemek için File.ReadAllBytes
kullanın ve sonra bayt dizisini Convert.ToBase64String(bytes)
kullanarak normal olarak kodlayın.
Yikes! Bu büyük olabilir. –
Gerçekten. Fakat bu günlerde makinelerin çok fazla belleği var. Ve eğer gerekirse, bir dosyadan tamponlu blokları okumak oldukça standart bir tekniktir :) –
An için ihtiyacım olan şey için harika çalışıyor. Bahşiş için teşekkürler! – Tone
Parçalar halinde bunu yapmanın bir yolu vardır, böylece bir kerede bir ton belleği yakmanıza gerek kalmaz.
.Net, yığınlamayı gerçekleştirebilen bir kodlayıcı içerir, ancak bu tür garip bir yer. System.Security.Cryptography ad alanına koydular.
Aşağıdaki örnek kodu sınamıştır ve yöntem veya Andrew'ın yukarıdaki yöntemini kullanarak aynı çıktıyı elde ediyorum.
İşte nasıl çalışır: CryptoStream adlı bir sınıfı başlatırsınız. Bu, başka bir akıma takılan bir adaptördür. CryptoTransform adlı bir sınıfı CryptoStream'e bağlarsınız (dosya/bellek/ağ akışına eklenir) ve veri akışları veri akışı üzerinden okunurken veya yazılırken gerçekleştirilir.
Normalde, dönüşüm şifreleme/şifre çözme işlemidir, ancak .net, ToBase64 ve FromBase64 dönüştürmelerini de içerir, dolayısıyla şifrelemeyi, yalnızca kodlamayı yapmayız.
İşte kod. Çıktınızı karşılaştırabilmeniz için Andrew önerisinin bir (belki de zayıf şekilde adlandırılmış) uygulamasını dahil ettim.
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));
}
}
Ayrıca CryptoStream'i eklediğim yere de oynuyorum. Encode yönteminde, çıktı (yazma) akışına iliştiriyorum, böylece CryptoStream örneğinde Write() metodunu kullanıyorum.
Okurken, giriş (okuma) akışına ekliyorum, bu yüzden CryptoStream üzerindeki okuma yöntemini kullanıyorum. Hangi akışı eklediğim önemli değil. Sadece uygun Okuma veya Yazma numaralandırma üyesini CryptoStream'in yapıcısına iletmem gerekiyor.
Koşmadım ve doğrulamadım, ama bu umut verici bir şekilde iyi ve harika görünüyor. İyi fikir! +1 – codingbear
Bunu test ettim. ÇALIŞIYOR bir cazibe gibi. Güzel bitti. – mcNux
@mcNux: Teşekkürler! – JMarsch
PDF neden bir bayt dizisinden farklı olmalıdır? –