Задача · C# (или друг език) · битове и байтове

Base64 от нулата

Base64 превръща произволни байтове (картинка, файл, парола) в текст само с букви, цифри, + и /. Ползва се навсякъде: в имейлите, в уеб страниците, в JSON. Напиши собствен кодер и декодер, без готовата функция.

Правила

Как работи

Три байта са 24 бита. Те се разделят на четири групи по 6 бита, а всяка група (число от 0 до 63) става един знак от азбуката:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

Пример с "Man":

текст: M a n байтове: 77 97 110 битове: 01001101 01100001 01101110 по 6: 010011 010110 000101 101110 числа: 19 22 5 46 знаци: T W F u

Ако байтовете не се делят на 3, последната група се допълва с нулеви битове, а липсващите знаци се заместват с =.

Етапи

1

Кодиране

ВходИзход
ManTWFu
MaTWE=
MTQ==
(празен текст)(празен текст)
Hello, World!SGVsbG8sIFdvcmxkIQ==

Готово, когато: всички редове дават точно този изход.

2

Декодиране

Готово, когато: decode(encode(x)) == x за всеки тест от етап 1.

3

Кирилица

ВходБуквиИзход
Zdravej7WmRyYXZlag==
Здравей70JfQtNGA0LDQstC10Lk=

Буквите са равен брой, а резултатът е почти двойно по-дълъг. Защо? Изведи байтовете на двата текста в шестнайсетичен вид и обясни какво виждаш. Какво общо имат всички байтове, с които започва кирилска буква?

4

Самопроверка с еталон

Генерирай 10 000 масива със случайни байтове със случайна дължина от 0 до 100. За всеки сравни своя резултат с Convert.ToBase64String, а после провери, че декодирането връща същите байтове.

Готово, когато: програмата отпечатва 10000 / 10000 OK. Ако някой случай се провали, отпечатва масива, за да го възпроизведеш.

★ 5

Шестнайсетичен дъмп

Команда b64 hex файл, която показва произволен файл по 16 байта на ред: отместване, байтове в шестнайсетичен вид и видимите знаци.

00000000  53 37 4D 46 01 00 00 00  01 00 00 00 79 03 00 00  |S7MF........y...|
00000010  15 0C 00 00 04 00 BE 00  06 2B 11 C3 51 68 13 C3  |.........+..Qh..|

С него тренираш окото си за истински шестнайсетичен редактор. Той ще ти трябва скоро.

★ 6

Картинка в текст

Кодирай малка PNG картинка и сглоби HTML страница, в която картинката е вътре в самия текст, без отделен файл:

<img src="data:image/png;base64,iVBORw0KGgo...">

Отвори страницата в браузъра. Защо Base64 версията е приблизително с една трета по-голяма от оригиналния файл?