2011-10-27 19 views
12

Büyük bir giriş dosyasını kodlamaya ve bir metin çıktı dosyasıyla bitiştirmeye çalışıyorum ve giriş dosyası bit-bitini kodlamanın mümkün olup olmadığını veya kodlamaya ihtiyacım olup olmadığını öğrenmeye çalışıyorum. tüm şeyi bir kerede.Bir dosyayı 64 kodlu olarak kodlamak mümkün mü?

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

cevap

26

anda ama 3 bir defada bayt veya 3 bayt katları yapacak bit-bit Bu mümkün değil!. Başka bir deyişle, giriş dosyanızın "bayt" cinsinden, 3 baytlık katların (büyüklüklerin) katları ise, parçaları ayrı ayrı kodlayabilir ve sonuçta elde edilen B64 kodlu parçaları biraraya getirebilirsiniz. buna karşılık gelen orde, son chuink'in boyutunun 3 katına eşit olması gerekmediğine dikkat edin, boyutunun modulo 3 değerine bağlı olarak, ilgili B64 değerinin birkaçının bu dolgu karakterleri (tipik olarak eşittir işareti) olacaktır.) Ancak bu tamam, bu tür bir dolguya sahip (ve ihtiyaç duyulan) tek parça olacağından,

Kod çözme yönünde, B64 kodlu veriyi 4 bayt'ın katları şeklinde bölmeniz gerekenden farklıdır. Onları istediğiniz gibi paralel/ayrı ayrı çözer ve orijinal verileri yeniden ekleyerek D decoded parçaları birlikte (tekrar aynı sırayla).

Örnek:

"Dosya" içerikler = "Never argue with the data." (Jimmy Neutron).
düz kodlama = parçalar şimdi Ik5ldmVyIGFyZ3VlIHdpdGggdGhlIGRhdGEuIiAoSmltbXkgTmV1dHJvbik=

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

Bu sırada parça gördüğünüz gibi, 3 kodlanmış parça, tüm dosya için üretilen kodla aynıdır. Kod çözme işlemi, benzer şekilde, 4 bayt katları olması koşuluyla, rastgele bölünmüş boyut ile yapılır. Kodlama için kullanılan boyutlar arasında herhangi bir uygunluğa kesinlikle gerek yoktur. (Her yön için tek bir boyuta standartlaştırılması rağmen (may yönetmek için işler daha düzgün ve kolay hale getirir) 300 say ve 400

+0

See (Eğer LINQPad içine bu fiş Eğer çıktıyı göreceksiniz) hangi değildi '3'ün katları. Beynim osuruktan kaybolduğunda, tampon boyutunu değiştirdim. Gerçekten, ben bir aptalım. Ve herkes soruyu "Tampon büyüklüğünü 3'ün katına çıkarın" ile yanıtlasa da, ilk önce sen olmalısın. Teşekkürler! – roryhewitt

3

Hmmm, kendinizi size apaçık bir şey fark etmiş olmalı base64 dönüşüm yazdıysam. Her sekans 3 oktet, 64'te 4 karakterle temsil edilir.

Böylece, temel64 verilerini dört karakterin her katına bölebilirsiniz ve bu parçaları orijinal bitlerine geri dönüştürebilirsiniz.

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

  • Her bir satırın uzunluğu sınırlı metin dosyaları mıdır?
  • , metin dosyaları çizgi odaklı mı, yoksa yalnızca karakter akışları mı?
  • Bir bayt kaç bit var?
  • , sonunda tüm disk kesimlerini kapsayan dosyaları oluşturabilen son bayt dosyalarıdır.

Bütün bu sorulara yanıt veremiyorsa, ne tam zorluklar size kaldı?

+0

Yok - bir aptaldım :( – roryhewitt

2

Verilen herhangi bir şarkı akışını parçalara bölmek çok önemsiz bir çabadır.

Herhangi bir baytlık parça sorun olmadan da temel alabilirisiniz.

Karşılaştığınız sorun, parçalarınızdaki belirli gereksinimleri (3 bayt katları) koymadığınız sürece, base64 kodlu parçaların sırasının, istediğiniz gerçek çıktıdan farklı olacağıdır.

C# içinde, tembel bir şekilde yapabileceğiniz bir (özensiz) yol budur. Yürütme aslında string.Concat çağrılana kadar ertelenir, böylece yığın dizeleriyle istediğiniz her şeyi yapabilirsiniz. Ben gereksinimi (belirli bir tampon boyutunu kullanmak çünkü etrafında defterleri zorunda bir süre harcanan,

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(); //output 
    final.Dump(); //output 
} 
public static class Extensions 
{ 
    public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> list, int chunkSize) 
    { 
     while(list.Take(1).Count() > 0) 
     { 
      yield return list.Take(chunkSize); 
      list = list.Skip(chunkSize); 
     } 
    } 
} 

Çıktı

bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ== 
bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ== 
İlgili konular