Формат / кодировка этого двоичного файла данных - PullRequest
1 голос
/ 26 июня 2009

Я пытаюсь написать программу, которая интегрируется с Advent Axys, программным обеспечением для специалистов по финансовому планированию и тому подобное. Сайт продукта находится здесь: http://www.advent.com/solutions/asset-managers-software/axys-platform

Мне нужно записать новые записи в файлы цен, но большинство из них являются двоичными. Я посмотрел в Интернете и не нашел много, и я написал по электронной почте их поддержку, но я сомневаюсь, что это поможет.

У меня есть короткий фиктивный файл и распечатка, которую программа передает этому файлу. Я прогнал файл через скрипт ruby, который печатает символ, если это символ слова или символ, и ASCII val в противном случае. Вот скрипт Ruby:

pri = File.read '062109_dummy.pri'
pri.each_byte do |char|
  print char.chr =~ /[\w!@#\$%\^&\*\(\)\-\\\/\+\.]/ ? char.chr : ' ' + char.to_s + ' '
end

И вывод:

<code>
pri1.001 254  250  251  252  29  0  0  2 adusnok 0  0  0  0  0  0  0  0  0 33333s7@ 1  254  250  251  252  29  0  0  2 csusxom 0  0  0  0  0  0  0  0  0 H 225 z 20  174 GA@ 1  254  250  251  252  29  0  0  2 etusvv 0  0  0  0  0  0  0  0  0  0  246 (\ 143  194  213 F@ 1  254  250  251  252  29  0  0  2 fdusoakbx 0  0  0  0  0  0  0  174 G 225 z 20  174 (@ 1  254  250  251  252  29  0  0  2 oousfidde09 0  0  0  0  0  154  153  153  153  153  185 S@ 1  254  250251  252  29  0  0  2 qpusfid_eqix 0  0  0  0  164 p 61  10  215 cL@ 1  254  250  251  252  29  0  0  2 vausvg_sc 0  0  0  0  0  0  0 )\ 143  194  245  248 P@ 1 

Обратите внимание, что если число имеет пробелы вокруг него, это означает, что это значение байта, а если нет, то значение байта было ASCII-представлением этого числа.

Я знаю, что цепочки букв (например, «adusnok») являются представлениями акций и тому подобного. Затем есть биты с 0-значными значениями, потому что пространство для символов имеет фиксированный размер (вот почему меньше символов после более длинного символа). Последовательность @ 1 254 250 251 252 29 0 0 2, по-видимому, означает конец записи, предшествующий символу новой записи. Кроме того, некоторые из них могут означать что-то одинаковое для всех этих, но не так много, кажется, то же самое. После этого я в принципе ничего не знаю. У меня есть распечатка того, что программа считает, что отображается на. С 3 пробелами, разделяющими каждый столбец, это:

adus   nok   23.45   NOKIA CORP ADR   0.393  05/30/2008
csus   xom   34.56   EXXON MOBIL CORPORATION COM   1.68   06/10/2009
etus   vv    45.67   VANGUARD LRG CAP ETF US PRIME MKT 750   1.04   3/31/2009

Есть еще кое-что, но это должно дать вам довольно хорошую идею. Я думаю, что вполне возможно, что описания и, возможно, другие вещи, хранятся в других файлах и просто просмотрены. Но я знаю, что цены в этом файле, потому что это файлы цен, и в этом весь смысл. Итак:

33333s7 => 23,45 H225 z 20 174 GA => 34,56 246 (\ 143 194 213 F => 45,67

Обратите внимание, что в первом сохраняются 3 и 7, все числа - это значения байтов, а не ASCII-представления значений. Также обратите внимание, что эти значения могут представлять немного больше, чем просто цена, но они определенно представляют цену.

Есть идеи? Я не знаком с обычными двоичными кодировками, но я не удивлюсь, если они используют довольно распространенный метод.

1 Ответ

2 голосов
/ 26 июня 2009

Обратный инжиниринг двоичного формата опасен, если вы собираетесь отгрузить свой обратный инженерный кодек. Они могут изменить формат файла без предупреждения. Однако, если вы связаны и решительно настроены это сделать:

Единственное, что вы можете сделать, это посмотреть на формат чисел с плавающей запятой IEEE:

http://steve.hollasch.net/cgindex/coding/ieeefloat.html

И затем, начиная с первого байта в файле, прочитайте 4 или 8 байтов данных. Преобразуйте оба набора (4 байта и 8 байтов) в значения типа float и double. Проверьте, соответствуют ли они значениям, которые, как вы знаете, находятся в файле. Если это так, вы, вероятно, нашли смещение цены. Распечатайте это, плюс смещение. Если нет, увеличьте ваш поиск на один байт и попробуйте снова.

Если вы сможете найти все значения таким образом, тогда вы сможете безопасно исправлять двоичные файлы во время выполнения, выполняя аналогичную операцию: ищите цены, о которых вы знаете, что они есть, и затем изменяя значения цен в правильное место.

Это совсем не надежно, потому что случайные последовательности данных могут иногда совпадать. Если вы заметите определенное расстояние между смещениями или какой-нибудь символ, который всегда присутствует, или, возможно, даже лучше, если вы сможете найти эти значения смещений в файле, у вас может быть что-то скромно стабильное.

...