Ці можна base64-кадавання файл на кавалкі?

патрэбен Спрабую base64 закадаваць велізарны ўваходных файл і ў канчатковым выніку з выхадных файлам тэкст, і я спрабую высветліць, ці можна кадзіраваць ўваходных файл біт за бітам, ці я кадзіраваць цэльны рэч адразу.

Гэта будзе зроблена на AS/400 (ISeries), калі гэта робіць ніякай розніцы. Я выкарыстоўваю сваю ўласную працэдуру кадавання base64 (напісана ў RPG), якая працуе выдатна, і, калі б не выпадак абмежаванняў па памеры, было б добра.

12

3 адказы

Гэта не магчыма <�моцны> біт-в-біт , але <�моцны> 3 байта ў той час, або кратныя 3 байта ў момант часу будзе рабіць !.

Іншымі словамі, калі вы падзеліце ваш ўваходны файл у «кавалкі», памер якіх (s) з'яўляецца (з'яўляюцца) кратныя 3 байта, вы можаце кадзіраваць лусты асобна і злучаць атрыманы B64 закадаваныя часткі разам (у адпаведным Ордаў, з вядома. Звярніце ўвагу, што апошні chuink не абавязкова павінен быць дакладна кратны 3 байта ў памеры, у залежнасці ад значэння па модулю 3 яго памеру яго адпаведнае значэнне B64 будзе мець некаторыя з гэтых знакаў запаўнення (як правіла, знак роўнасці), але гэта нармальна , так як Thiswill быць адзінай часткай, якая мае (і павінен) такое запаўненне.

У напрамку дэкадавання, гэта тая ж ідэя, за выключэннем таго, што вам трэба падзяліць дадзеныя B64-закадаваны ў пакаванні 4 байта. Дэкадаванне іх паралельна/індывідуальна па жаданні і паўторна частка зыходных дадзеных шляхам дадання дэкадаваць часткі разам (зноў у тым жа парадку).

<�Моцны> Прыклад: </моцны>

"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=

Як вы бачыце кавалак у тым парадку, у 3 закадаваныя глыбах складаюць такія ж, як код, створаны для ўсяго файла.

Дэкадаванне выконваецца аналагічна, з адвольным chuncked памеру, пры ўмове, што яны кратныя 4 байта. Існуе зусім не трэба мець якой-небудзь перапіскі паміж памерамі, якія выкарыстоўваюцца для кадавання. (Хаця стандартызацыя да аднаго памеру для кожнага напрамку (скажам, 300 і 400), можа робіць рэчы больш аднароднымі і лягчэй кіраваць.

26
дададзена
Глядзіце, я правёў некаторы час маючы ўнікаць вакол, таму што патрабаванне было выкарыстоўваць пэўны памер буфера (які ня кратны 3). Пасля таго, як мой мозг пердеть знік, я проста змяніў памер буфера. Так на самой справе, я ідыёт. І хоць усе адказалі на пытанне з відавочным «Зрабіць памер буфера кратным 3», вы атрымаеце галачку, таму што ты быў першым. Дзякуй!
дададзена аўтар roryhewitt, крыніца

Хммм, калі вы напісалі пераўтварэнне base64 сябе, вы павінны былі заўважыць відавочную рэч: кожная паслядоўнасць з 3 актэта, прадстаўлена 4-х знакаў у base64.

Такім чынам, вы можаце падзяліць дадзеныя base64 на кожным кратнаму чатырох знакаў, і гэта будзе магчыма пераўтварыць гэтыя кавалкі назад у іх зыходных бітаў.

Я не ведаю, як знакавыя файлы і файлы байты апрацоўваюцца на AS/400, але калі ў яго ёсць абодва паняцці, гэта павінна быць вельмі лёгка.

  • з'яўляюцца тэкставыя файлы абмежаваныя па даўжыні кожнага радка?
  • ўяўляе сабой тэкставыя файлы, радковыя, або яны проста знакавыя патокі?
  • колькі біт мае адзін байт ёсць?
  • з'яўляюцца байтавая файлы пракладзены ў канцы, так што можна ствараць толькі файлы, якія ахопліваюць цэлыя сектары дыска?

Калі вы можаце адказаць на ўсе гэтыя пытанні, якія менавіта цяжкасці ў вас засталіся?

2
дададзена
Не - я не быў ідыётам :(
дададзена аўтар roryhewitt, крыніца

Гэта трывіяльная спроба падзяліць любы зададзены струменевы на кавалкі.

Вы можаце base64 любы кавалак байтаў без праблем.

Праблема вы сутыкнуліся з у тым, што калі вы размяшчае пэўныя патрабаванні на вашыя кавалкі (кратныя 3 байта), паслядоўнасць base64-закадаваныя кавалкаў будзе адрознівацца ад фактычнага выніку вы хочаце.

У C# гэта адзін (нядбайны), як вы маглі б зрабіць гэта ляніва. Выкананне фактычна не адкладаюцца да String.Concat называецца, так што вы можаце зрабіць усё, што вы хочаце з блокавай радком. (Калі вы падлучаеце гэта ў LINQPad вы ўбачыце выхад)

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(); //выхад
    final.Dump(); //выхад
}
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);
        }
    }
}

выхад

bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ==
bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ==
2
дададзена