Base64-encode yığınlarındaki bir dosyayı temel almak mümkün müdür?

Base64'ü büyük bir giriş dosyasını kodlamaya çalışıyorum ve bir metin çıkış dosyasıyla bitirdim ve giriş dosyasını bit bit kodlamanın mümkün olup olmadığını veya tamamını kodlamam gerekip gerekmediğini bulmaya çalışıyorum bir kerede bir şey.

Bu, herhangi bir fark yaratırsa, AS/400'de (iSeries) yapılacaktır. Mükemmel şekilde çalışan kendi base64 kodlama yordamını (RPG ile yazılmış) kullanıyorum ve boyut sınırlamaları söz konusu değilse, iyi olurdu.

12

3 cevap

bit-by-bit mümkün değil, ancak bir seferde 3 bayt veya aynı anda 3 baytın katları !

Başka bir deyişle, eğer giriş dosyanızı "boyut" u (boyutu) 3 baytın katları şeklinde bölerseniz, parçaları ayrı ayrı kodlayabilir ve elde edilen B64 kodlu parçaları bir araya getirebilirsiniz (karşılık gelen düzende Son kanalın tam olarak 3 baytlık bir katı olmadığına dikkat edin, boyutunun modulo 3 değerine bağlı olarak, karşılık gelen B64 değeri bu doldurma karakterlerinden birkaçına sahip olacaktır (genellikle eşittir işareti), ancak sorun yok. Çünkü, bu dolgu malzemesi olan (ve ihtiyaç duyan) tek parça olacaktır.

Kod çözme yönünde, B64 kodlu verileri 4 baytın katlarına ayırmanız gerekmesi dışında aynı fikirdir. Bunları istediğiniz şekilde paralel/ayrı ayrı kodlayın ve kodu çözülen parçaları bir araya getirerek orijinal verileri yeniden parçalayın (aynı sırada).

Örnek:

"File" contents = "Never argue with the data." (Jimmy Neutron).
Straight encoding = Ik5ldmVyIGFyZ3VlIHdpdGggdGhlIGRhdGEuIiAoSmltbXkgTmV1dHJvbik=

Now, in chunks:
"Never argue     -->     Ik5ldmVyIGFyZ3Vl
with the         -->        IHdpdGggdGhl
data." (Jimmy Neutron) --> IGRhdGEuIiAoSmltbXkgTmV1dHJvbik=

Bu siparişte parçayı gördüğünüzde, kodlanmış 3 parça, tüm dosya için üretilen kodla aynı miktardadır.

Kod çözme, benzer şekilde, 4 baytın katları olması koşuluyla, keyfi boyutta parçalarla yapılır. Kodlama için kullanılan boyutlar arasında kesinlikle herhangi bir yazışma olması gerekmez. (her yön için tek bir boyuta standardizasyon sağlamasına rağmen (örneğin 300 ve 400) işleri daha düzenli ve daha kolay yönetebilir hale getirir.

26
katma
Görmek için biraz zaman harcamak zorunda kaldım, çünkü gereklilik belirli bir tampon boyutu kullanmaktı (ki bu 3'ün katı değildi). Beyin-osuruk kaybolduğunda tampon boyutunu değiştirdim. Gerçekten, ben bir aptalım. Ve herkes soruyu “Tampon boyutunu 3 katı yap” şeklinde açık bir şekilde cevaplamış olsa da, onay işaretini alırsınız, çünkü ilk sizsiniz. Teşekkürler!
katma yazar roryhewitt, kaynak

Hmmm, base64 dönüşümünü kendiniz yazdıysanız, bariz şeyi farketmiş olmalısınız: 3 oktetin her dizisi base64'te 4 karakterle temsil edilir.

Böylece, temel64 verilerini dört karakterin her birinde bölebilirsiniz; bu öbekleri orijinal bitlerine geri döndürmek mümkün olacak.

Karakter dosyalarının ve bayt dosyalarının AS/400'de nasıl işlendiğini bilmiyorum, ancak her iki konsepte de sahipse, bu çok kolay olmalı.

  • Metin dosyaları her satırın uzunluğunda sınırlı mı?
  • metin dosyaları satır odaklı mı, yoksa sadece karakter akışları mı?
  • bir baytın kaç biti var?
  • bayt dosyaları sonunda doldurulur, böylece yalnızca tüm disk sektörlerini kapsayan dosyalar oluşturabilir mi?

Tüm bu soruları cevaplayabiliyorsanız, tam olarak ne gibi zorluklarınız var?

2
katma
Yok - Ben bir aptalım :(
katma yazar roryhewitt, kaynak

Verilen herhangi bir bytestream parçasını parçalara bölmek önemsiz bir çabadır.

Herhangi bir bayt yığınını sorunsuz bir şekilde temel alabilirsiniz64.

Karşılaştığınız sorun, parçalarınıza (3 baytın katları) özel gereksinimler koymadığınız sürece, base64 kodlu parçaların dizisinin, istediğiniz gerçek çıktıdan farklı olmasıdır.

C # 'da, bu tembelce yapabileceğiniz bir yoldur (özensiz). Yürütme aslında string.Concat çağrılana kadar ertelenir, böylece chunked dizelerle istediğiniz her şeyi yapabilirsiniz. (Bunu LINQPad'e takarsanız çıktıyı göreceksiniz)

void Main()
{
    var data = "lorum ipsum etc lol this is an example!!";
    var bytes = Encoding.ASCII.GetBytes(data);
    var testFinal = Convert.ToBase64String(bytes);

    var chunkedBytes = bytes.Chunk(3);
    var base64chunks = chunkedBytes.Select(i => Convert.ToBase64String(i.ToArray()));
    var final = string.Concat(base64chunks);

    testFinal.Dump(); //Çıktı
    final.Dump(); //Çıktı
}
public static class Extensions
{
    public static IEnumerable> Chunk(this IEnumerable list, int chunkSize)
    {
        while(list.Take(1).Count() > 0)
        {
            yield return list.Take(chunkSize);
            list = list.Skip(chunkSize);
        }
    }
}

Çıktı

bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ==
bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ==
2
katma