Расшифровка неизвестной кодировки - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь понять строковую кодировку проприетарного формата файла (fp7 формат файла из Filemaker Pro ).

  1. Я обнаружил, что каждый символобфусцирован XOR с 0b01011010 и что длина строки кодируется с использованием одного начального байта (максимальная длина строки в Filemaker составляет 100 символов).
  2. Кодировка - это переменная байтовая кодировка, где по умолчанию ISO 8859-1 (западный) используется для кодирования большинства символов.
  3. Если необходимо кодировать символ Unicode вне ISO 8859-1, в строку включается некий вид control characters, который изменяет декодирование следующегоили несколько следующих символов.Эти управляющие символы используют пространство символов управления ASCII (в частности, от 0x01 до 0x1f).Это то, где я застрял, так как я не могу найти образец того, как работают эти управляющие символы.

Некоторые примеры того, что я нашел:

  • При обнаружении управляющего символа 0x11 следующие символы создаются путем добавления 0x40 к значению байта, например, символ Ā (Unicode \U0100) кодируется как 0x11 0xC0 (0xC0 + * 1028).* = 0x100).
  • При обнаружении управляющего символа 0x10 предыдущий управляющий символ, похоже, сбрасывается.
  • При обнаружении управляющего символа 0x03 следующий (только следующий!) символ создается путем добавления 0x100 к значению байта.Если управляющему символу 0x03 предшествует 0x1b, то все последующие символы создаются путем добавления 0x100.

Пример строки (0_ĀĐĠİŀŐŠŰƀƐƠưǀǐǠǰȀ), ее кодовых точек Юникода и кодировкив Filemaker:

   char   0  _      Ā   Đ   Ġ   İ      ŀ      Ő      Š      Ű         ƀ   Ɛ   Ơ   ư   ǀ   ǐ   Ǡ   ǰ         Ȁ  
unicode  30 5f    100 110 120 130    140    150    160    170       180 190 1a0 1b0 1c0 1d0 1e0 1f0       200
encoded  30 5f 11  c0  d0  e0  f0  3  40  3  50  3  60  3  70 1b  3  80  90  a0  b0  c0  d0  e0  f0 1c  4  80

Как видите, символы 0 и _ кодируются с использованием их прямого значения Unicode / ASCII.Символы ĀĐĠİ кодируются с помощью управляющего байта 0x11.Затем ŀŐŠŰ кодируются с использованием 0x03 для каждого символа, затем 0x1B 0x03 используются для кодирования следующих 8 символов и т. Д.

Эта схема кодирования выглядит кому-нибудь знакомой?

Правила просты для персонажей размером до 0x200, но затем становятся все более и более запутанными, вплоть до того, что они кажутся зависимыми от позиции.

Я могу привести больше примеров для выходных головоломоки радость.

...