Возможно ли base64-кодировать файл кусками? - PullRequest
15 голосов
/ 27 октября 2011

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

Это будет сделано на AS / 400 (iSeries), если это что-то изменит.Я использую свою собственную процедуру кодирования base64 (написанную на RPG), которая отлично работает, и, если бы не было ограничений по размеру, все было бы в порядке.

Ответы [ 3 ]

30 голосов
/ 27 октября 2011

Это невозможно побитово , но 3 байта за раз, или умножение на 3 байта за раз будет !.

Другими словами, если вы разбиваете свой входной файл на «чанки», размер (ы) которых кратен 3 байтам, вы можете отдельно кодировать чанки и собирать воедино полученные B64-кодированные куски (в соответствующих orde, конечно. Обратите внимание, что последний chuink не должен быть точно кратным 3 байтам в размере, в зависимости от значения по модулю 3 его размера его соответствующее значение B64 будет иметь несколько из этих символов заполнения (обычно это знак равенства) но это нормально, так как это будет единственная часть, которая имеет (и нуждается) в таком заполнении.

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

Пример:

Содержимое "File" = "Never argue with the data." (Jimmy Neutron).
Прямое кодирование = Ik5ldmVyIGFyZ3VlIHdpdGggdGhlIGRhdGEuIiAoSmltbXkgTmV1dHJvbik=

Теперь, кусками:
"Never argue -> Ik5ldmVyIGFyZ3Vl
with the -> IHdpdGggdGhl
data." (Jimmy Neutron) -> IGRhdGEuIiAoSmltbXkgTmV1dHJvbik=

Как видно из фрагмента в этом порядке, 3 закодированных фрагмента равны количеству кода, созданного для всего файла.

Декодирование выполняется аналогично с произвольным размером фрагмента при условии, что они кратны 4 байтам. Совершенно не обязательно иметь какое-либо соответствие между размерами, используемыми для кодирования. (хотя стандартизация по одному размеру для каждого направления (скажем, 300 и 400) может сделать вещи более однородными и более простыми в управлении.

2 голосов
/ 27 октября 2011

Это простая попытка разбить любой данный поток на куски.

Вы можете без проблем создавать 64 любых байта.

Проблема, с которой вы столкнулись, состоит в том, что, если вы не наложите на свои чанки особые требования (кратные 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(); //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);
        }
    }
}

выход

bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ==
bG9ydW0gaXBzdW0gZXRjIGxvbCB0aGlzIGlzIGFuIGV4YW1wbGUhIQ==
2 голосов
/ 27 октября 2011

Хммм, если вы написали преобразование base64 самостоятельно, вы должны были заметить очевидную вещь: каждая последовательность из 3 октетов представлена ​​4 символами в base64.

Таким образом, вы можете разделить данные base64 на каждое кратное четырем символам, и будет возможно преобразовать эти куски обратно в их исходные биты.

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

  • ограничены ли текстовые файлы длиной каждой строки?
  • текстовые файлы ориентированы на строки, или они просто символьные потоки?
  • сколько битов у одного байта?
  • - это байтовые файлы, дополненные в конце, так что можно создавать только файлы, охватывающие целые сектора диска?

Если вы можете ответить на все эти вопросы, какие именно трудности у вас остались?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...