metaclass: (Default)
[personal profile] metaclass
Подкинули безумную задачку - есть бинарный файл-словарь. Нужно из него вытащить список слов и вставить в другой словарь.
Ну сел разбираться. Вижу - классика, в начале файла гигантский индекс из записей постоянной структуры с указателями(они на глаз хорошо видны, периодическая структура), после него идут список слов, слова переменной длины. Задача простейшая - определить длину и формат записи индекса, вычитать слова и сохранить в что-то более вменяемое.
Слова в юникоде, и самое главное - в начале файла есть unicode byte order mark(FFFE).
Высчитал длину записи индекса, сдампил его с длиной строки равной длине записи, и смотрю - ну что-то странное откровенно. Вижу что нарастающие указатели, вижу что данные бинарные, но при этом - формат явно уникод, т.е. байт, 0, байт, 0, иногда байт,20, итд.
Ну ладно, сначала думаю, найду где длина слова живет. Взял три слова с начала, посчитал длину, сразу же увидел где она в индексе. Решил почитать пока чисто через длину слова. Фиг, иногда соскакивает позиция, видимо какие-то дополнительные флаги к слову добавлены. В процессе осмысления смотрю на первые восемь байт индекса и вижу что в натуре из них получается указатель на слово, если их умножить на 2 и прибавить 2. Но не всегда. Иногда спрыгивает в дебри куда-то. И старшие два байта вместо 0000 - 2000.

Оказывается, психи, которые писали файл, писали в него бинарные данные побайтно, не отключив конверсию этого дела в юникод. Т.е. каждые 9 байт индекса записывались как 18 байт записи в файле с конверсией странных символов из текущей локали в соответствующие юникодные. И конверсией 00 в пробел, т.е. 00 - 2000.
Вуду-программирование. Сказали людям "сделать юникод-версию", они заменили функции на соответствующие юникодные и все :)
Пришлось составить список юникодных символов, сопоставить методом анализа файла их реальным байтам и написать конвертор. При этом байты 20 и 00 в выходном файле формально неразличимы, пришлось добавить эмпирический анализатор который ищет правильное значение по критерию типа "следующий индекс должен отличаться от предыдущего на длину слова")

Date: 2009-01-01 04:01 pm (UTC)
From: [identity profile] vp.livejournal.com
Да уж :)

Date: 2009-01-01 04:30 pm (UTC)
From: [identity profile] archangel-rhn.livejournal.com
Файл писали не психи. Его писали студенты. Психи сделали бы все иначе, а именно - сделали бы все правильно, более того, изобрели бы что-то новое, не вписывающееся в рамки классического программирования, стандартов, соглашений.

Date: 2009-01-01 06:00 pm (UTC)
From: [identity profile] dorogoj.livejournal.com
В бытность существования компьютеров до ZX-Spectrum'овской эпохи. Паяли с товарищем нечто самопальное (Орион-128 по схемке из журнала радио) а потом стали подключать к этому чуду мышь!!!
Долго мучили осцилограф, анализировали как работает интерфейс RS-232. Приделали несколько операционных усилителей чтобы получить нормальный сигнал, потратили кучу времени а потом оказалось, что сигнал интерфейса мы припаяли на провод питания мышки и!!! из помех по питанию усилителями и т.п. таки восстановили нормальный сигнал и это чудо даже заработало!
Мораль: может есть способ проще? :-)

Date: 2009-01-01 10:57 pm (UTC)
From: [identity profile] 1ceheart.livejournal.com
Ааа, ггг, я один раз так тоже сделал, правда, не с мышью :)

Date: 2009-01-02 10:50 am (UTC)
From: [identity profile] pakeha-by.livejournal.com
А как работала с этим словарём "оригинальная" прога, если 20 и 00 неразличимы?
Или словарь составлен и всё на этом (никто его не пользует)?

Date: 2009-01-02 10:54 am (UTC)
From: [identity profile] metaclass.livejournal.com
Ну оригинальная прога его вообще открыть не смогла, в гугле про ее производителя только одно упоминание (в каком-то допотопном бизнес-каталоге).
А те словари, которые в теории должны были открываться(не-юникодные), я не смог распаковать потому что они были упакованы какого-то каким-то странным zip, который у меня ни одна прога не поняла.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 24th, 2025 09:01 pm
Powered by Dreamwidth Studios