Сжатие ASCII-строк в Quickbasic

Тема в разделе "WASM.CRYPTO", создана пользователем alexx, 15 янв 2009.

  1. alexx

    alexx New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    2
    Здравствуйте!

    Хотел изменить меню и сообщения в Quickbasic(дос). Оказалоь, что строки сжаты. Нашел, где хранятся и где распаковываются. В зависимоти от частоты, для одного символа используется от 3 (самые частые) до 14 бит. Для распаковки используется таблица:
    Код (Text):
    1. Tab db  01, 35, 02, 1E, 03, 10, 04, 07, CD, 05, BF, 06, D2, B3, C7, 08,
    2.         09, 0A, C3, 8F, A6, 0B, B5, 0C, 0D, 9E, B9, 0E, 0F, 85, 94, 88,
    3.         11, 1A, 12, 14, 13, C8, A5, D4, 15, 19, 16, A4, C6, 17, 18, 8D,
    4.         8C, 92, A7, AE, 1B, C0, 1C, C2, AA, 1D, A2, AC, 1F, 82, 20, CF,
    5.         21, 2C, 22, CB, BE, 23, 24, B2, 25, 2B, 26, 27, 97, 9A, AB, 28,
    6.         D5, 29, 2A, 8B, 95, 87, A0, B8, 2D, 31, 2E, D3, 2F, B0, 8E, 30,
    7.         A8, 90, A3, 32, 33, 34, A9, 9B, 9D, 9F, 36, 3A, 37, 39, 38, CA,
    8.         CE, D0, C9, C5, 3B, C1, 3C, BD, 3D, 46, 3E, C4, B4, 3F, 40, B7,
    9.         41, 42, B1, B6, 8A, 43, 44, 98, 45, 84, BA, 83, 47, 48, AF, D1,
    10.         49, AD, 4A, 53, 4B, 52, 4C, 4F, 4D, 99, 4E, 81, A1, 86, 50, 91,
    11.         51, 9C, BB, BC, 96, CC, 54, 80, 89, 93
    Код:
    Код (Text):
    1. next_char:
    2.         dec       [bp-0002]    ; счетчик = длина исходной строки
    3.         jl        exit
    4.         mov       si, tab     ; таблица
    5.  
    6. next_enc_bit:
    7.         mov       ax,dx        ; номер бита в сжатой строке
    8.         mov       bl,008       ; переводим в байты
    9.         div       bl
    10.         inc       dx           ;    след. бит
    11.         mov       ch,080       ; бит в
    12.         mov       cl,ah        ; закод. байте
    13.         shr       ch,cl
    14.         cbw
    15.         xchg      bx,ax        ; bx=номер байта в сжатой строке
    16.         add       bx,[bp+00006]    ; + адрес строки
    17.         test      [bx],ch        ; если бит=1, смещаемся в таблице на 1 ячейку
    18.         je        no_inc
    19.         inc       si
    20.  
    21. no_inc:
    22.         sub       bh,bh
    23.         mov       bl,[si]       ; читаем адрес из таблицы
    24.         rcl       bl,1          ; если верхний бит 1, убираем его -
    25.         jnb       no_char
    26.         shr       bl,1          ; получаем индекс буквы
    27.         mov       al,[bx+000D7]    ; её адрес
    28.         stosb
    29.         jmp      next_char
    30.                                ; если 0 - удваиваем адрес
    31. no_char:
    32.         mov       si, tab       ; и читаем из таблицы дальше
    33.         add       si,bx        
    34.         jmp      next_enc_bit
    35. exit:
    36. ...
    Кто-нибудь знает, как создать такую таблицу, если я хочу добавить свои символы? Там их всего 86. Подскажите, пожалуйста. Ну или хотя бы в каком направлении искать. Совсем ничего про это не знаю, а изучать всё существующее нереально. Во всяком случае, я ничего пока не нашёл.
     
  2. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    http://en.wikipedia.org/wiki/Huffman_coding
    http://www.compressconsult.com/huffman/
    ?
     
  3. alexx

    alexx New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    2
    Да, это оно. Спасибо огромное. Я когда искал, находил и про Фано и про Хаффмана, но, немного почитав, подумал - не то. А тут по ссылкам всё прекрасно расписано. Хорошо всё-таки, когда знаешь, что искать. Спасибо ещё раз!