КОДЕРАМ
ТЕКСТОВАЯ АРИФМЕТИКА. 4 = 3
(C) Денис Токарчук
По праву, наверное, принадлежит главенствующее место кодировки ASCII (8 бит) в мире текстов. Да, ведь она предоставляет огромные просторы в плане написания текстов. Эта система знаков элегантна, удобна, красива. И это ни слова подхалимства, а лишь констатация факта. Я думаю, эта кодировка не заняла бы первого места, если бы она была убога и неудобна. Однако и у нее есть свои проблемы несовместимости, породившиеся, вероятно, политикой некоторых больших компьютерных компаний. Ну ладно, я отвлекся.
Но тем не менее, какая бы ASCII ни была бы универсальной, но жрет ценной памяти она немерено. Да, конечно, IBM'щики этого не замечают — у них и винты резиновые, и диски по 1.44 мегабайта, и оперативки — десятки, а то и сотни мегабайт. По-другому себя чувствует Спектрум, в котором за стандарт принято 128 килобайт и диски по 640 кило. Как только ни придумывали сокращать размеры текстов спектрумовские издатели, однако реально эффективно сжимающих алгоритмов и кодировок разработано не было. Я имею в виду не те компрессоры, которые просто разжимают перед "употреблением" текст в память, а именно алгоритмы, способные без компрессии экономить ценные килобайты.
Как вы, наверное, заметили — в нашей газете все буквы заглавные. И это не "заскок" редактора, а необходимость, вызванная экономией памяти. Собственно, здесь текст и представлен в кодировке, разработанной специально для ZX-Time. Кодировка называется ZXT 6-Bit Symbolic Codes v.1 (ZXT6BSC1). Как видно из названия, в данной кодировке максимальная разрядность буквы — шесть бит. А отсюда становится понятным следующее — в три байта вполне можно вместить 4 буквы. Выходит, что экономия составляет 25% по сравнению с ASCII вне зависимости от размера и содержания текста. Естественно, пришлось кое-чем пожертвовать. Хотя "кое-чем" — сказано слабо... Это и отсутствие строчных букв, и текстовой графики, и обеднение символьного набора. Поэтому вы сами можете для себя решать — жертвовать ли этими благами ради экономии памяти...
Также необходимо рисовать специальный шрифт под эту кодировку. Менее болезненно шестибитовый формат воспринимается при использовании шрифта шириной 4 точки (64 символа в строке), как это сделано у нас. На других шрифтах очень заметна скудность символьного набора. :(
Но я повторюсь — теряя эти блага цивилизации, мы приобретаем настолько для нас ценные килобайты. Например: в ZX-Time под текст отводится 5 страниц памяти ($5 \times 16\text{К} = 80\text{К}$). То есть в газету максимально может влезть:
$$(81920\text{ байт} \times 8\text{ бит}) / 6\text{ бит} = 109226\text{ знаков}$$
Итак, в 80К мы поместили более 106К. А будь у нас текст в обычном ASCII, то мы бы ломали голову, думая — а как бы эти 26 килобайт подгрузить... Хотя, возможно, и 106 килобайт может и не хватить... Но это уже другая история.
От теории перехожу к... следующей теории :). Теперь я расскажу, каким образом я умудрился в шесть бит (64 знака) засунуть заглавные буквы русского и английского алфавита, цифры, знаки и один единственный управляющий код (перевод строки). Это было довольно мучительно, так как ликвидация очередного знака переносилась болезненно и вся затея поддавалась сомнению — "А на фиг все это нужно!?!". Однако, сколько я ни закидывал всю эту работу в долгий ящик, все-таки довел дело до конца.
Как известно, в русском алфавите 33 буквы, в английском (латинском) алфавите их 26, цифр должно быть 10, а знаков как минимум 17 плюс пробел и Enter:
$$33 + 26 + 10 + 17 + 1 + 1 = 88\text{ знаков}$$
Но можно сэкономить, если некоторые русские буквы "подменять" английскими, схожие по изображению цифры также предоставлять в распоряжение какого-либо алфавита (например, символ 'О' — он у нас и ноль, и английская буква O, и русская буква О). Так и сэкономили на буквах.
Таблица кодов ZXT6BSC1
| Знак | Код | Знак | Код | Знак | Код | Знак | Код |
|---|---|---|---|---|---|---|---|
| А | #00 |
Q | #10 |
8 | #20 |
/ | #30 |
| В | #01 |
R | #11 |
9 | #21 |
= | #31 |
| С | #02 |
S | #12 |
Ж | #22 |
! | #32 |
| Д | #03 |
Т | #13 |
Й | #23 |
. | #33 |
| Е | #04 |
U | #14 |
Л | #24 |
, | #34 |
| F | #05 |
V | #15 |
Ф | #25 |
; | #35 |
| G | #06 |
W | #16 |
Ц | #26 |
: | #36 |
| Н | #07 |
X | #17 |
Щ | #27 |
' | #37 |
| I | #08 |
Y | #18 |
Ь | #28 |
$ | #38 |
| J | #09 |
Z | #19 |
Ы | #29 |
% | #39 |
| К | #0A |
1 | #1A |
Э | #2A |
( | #3A |
| L | #0B |
2 | #1B |
Ю | #2B |
) | #3B |
| М | #0C |
3 | #1C |
Я | #2C |
? | #3C |
| N | #0D |
4 | #1D |
+ | #2D |
# | #3D |
| О | #0E |
5 | #1E |
- | #2E |
ПРОБЕЛ | #3E |
| Р | #0F |
7 | #1F |
***** | #2F |
ENTER | #3F |
Ну а теперь несложно догадаться, что где и кого заменяет...
Упаковка символов
Теперь поговорим о том, как текст перевести в формат ZXT6BSC1. Давайте посмотрим на бинарный вид "маски" символа шестибитового формата:
%00111111
Но здесь он представлен в целом байте, где первые два бита не используются. Собственно, и толку не было бы заваривать всю кашу, если бы не эти два бита. Как отмечалось выше, в три байта влазит четыре знака, а это означает, что мы будем умудряться и, чего бы нам это ни стоило, засовывать шестибитовые символы в красивую непрерывную цепочку битов. То есть будем беспощадно разрывать шестибитовые символы и рассовывать сэкономленные куски по оставшимся двум битам каждого байта. Примерно вот так:
6 бит 6 бит 6 бит 6 бит
------ ------- ------- ------
011001 010111 101110 010011
--------- --------- ---------
1 байт 1 байт 1 байт
Поделитесь вашим мнением о статье