Страница 1 из 1

информация из файла

Добавлено: 01 июн 2005, 09:05
Den
Привет участникам форума!

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

unsigned char szBuf[] = {0x04, 0x1E, 0x04, 0x42, 0x04, 0x34, 0x04, 0x35, 0x04, 0x3B, 0x00, 0x20, 0x04, 0x1E, 0x04, 0x11, 0x04, 0x18};

Выдает: ОтделОБИ.
0x00, 0x20 – означает пробел, но я его не обрабатываю, пока. Это второстепенный вопрос.

«ОтделОБИ» (в шестнадцатеричном виде) забито в szBuf[] вручную, это не годится.
В реальности информация попадает так:
szBuf[5000] ;
//открытие файла
CFile in;
if(in.Open(m_str, CFile::modeRead) = =NULL){
MessageBox("Ошибка ввода имени файла или файл не найден");
return;
}
//чтение файла
in.Read(szBuf, 5000);
И должно выводиться: «ОтделОБИ» и др. полезная информация (в свои поля). Но поскольку начали разговор об «ОтделОБИ» о нем и продолжим.

Теперь подробнее. Я, насколько толку хватило, проанализировал файл, открыв его в шестнадцатеричном виде. Есть определенная закономерность, перед любой полезной информацией идет схожий шестнадцатеричный код.
Перед «ОтделОБИ» - 31 1B 30 19 06 03 55 04 0B 1E 12. То, что выделено курсивом почти везде разное, жирным шрифтом означает всегда кол-во шестнадцатеричных значений, перекодировав которое получаем нужную информацию.
Необходимо наложить фильтр, что бы в перекодировщик попадала нужная информация, а не все подряд!!!
Да…если смотреть файл простым его открытием, то информация расположена обычно. Т.е. читается слева направо и сверху вниз. Если же в шестнадцатеричном виде, то слева направо, но снизу вверх. Может пригодится (данная информация)…не знаю.

Надеюсь, что более менее вопрос понятен (хотя признаться одолевают сомнения). Если кто-то возьмется за этот вопрос, и ответит, так что бы я понял буду очень признателен! Кстати к признательности могу, если надо, на e-mail сбросить перекодировщик.
Работаю в Visual C++ 6.0.

С уважением, Den!

Добавлено: 01 июн 2005, 13:11
Kolinus
Лично мне вопрос не понятен совершенно (если честно)
что вообще содержится в файле?
МОт стоит выложить кусок файла?
ЗЫ 12 у тебя в 16-ричном посему в 10 ричном енто 18 (или я опять не так понял ??)

Добавлено: 01 июн 2005, 14:41
WinMain

Код: Выделить всё

unsigned char szBuf[] = {0x04, 0x1E, 0x04, 0x42, 0x04, 0x34, 0x04, 0x35, 0x04, 0x3B, 0x00, 0x20, 0x04, 0x1E, 0x04, 0x11, 0x04, 0x18};
Здесь не нужен никакой перекодировщик. Это обычный текст в формате UNICODE. Если предстваить данные байты как массив WCHAR, а потом применить функцию WideCharToMultiByte(), то получишь тот же самый результат...

Код: Выделить всё

WCHAR wStr[] = {0x041E, 0x0442, 0x0434, 0x0435, 0x043B, 0x0020, 0x041E, 0x0411, 0x0418};

const int nSize = sizeof(wStr)/sizeof(WCHAR);
char szText[nSize+1] = "";
WideCharToMultiByte(CP_ACP, 0, wStr, -1, szText, nSize, NULL, NULL);
MessageBox(0, szText, "Текст", MB_OK);
Поэтому лучше читать данные не как массив отдельных байтов, а как массив двухбайтовых слов.

А те данные, которые у тебя представлены перед строкой - это скорее всего какие-то четырёхбайтовые числовые значения типа int, long или float.

Добавлено: 01 июн 2005, 17:04
Den
Kolinus, верно 12 в 16-ричном это 18 в 10-ричном. Кусок выложу позже, сейчас нет под рукой. Так сложилось.

WinMain, к сожалению не знал ф-ции WideCharToMultiByte(). Поэтому банально на С++ писал перекодировщик. Ты писал, что данные перед строкой, это скорее всего какие-то четырёхбайтовые числовые значения типа int, long или float.
Хорошо, но как их использовать для получения нужной информации, наложения фильтра ...

Благодарен вам за сотрудничество!

Добавлено: 02 июн 2005, 16:28
Den
Kolinus, если тебя заинтересует, то вот фрагмент файла в 16-ричном виде:

30 82 07 20 06 09 2A 86 48 86 F7 0D 01 07 02 A0
82 07 11 30 82 07 0D 02 01 01 31 00 30 OB 06 09
2A 86 48 86 F7 0D 01 07 01 А0 82 06 F5 30 82 03
D7 30 82 03 84 А0 03 02 01 02 02 0A 61 53 C9 86
00 00 00 00 02 7D 30 0A 06 06 2A 85 03 02 02 04
05 00 30 81 8B 31 0B 30 09 06 03 55 04 06 13 02
52 55 31 15 30 13 06 03 55 04 07 1E 0С 04 1С 04
3E 04 41 04 ЗА 04 32 04 30
31 39 30 37 06 03 55
04 0A 1E 30 04 1С 04 38 04 3D 04 38 04 41 04 42
04 35 04 40 04 41 04 42 04 32 04 3E 00 20 04 44
04 38 04 3D 04 30 04 3D 04 41 04 3E 04 32 00 20
04 20 04 24
31 11 30 0F 06 03 55 04 0B 1E 08 04
13 04 23 04 24 04 1A
31 17 30 15 06 03 55 04 03
1E 0E 00 43 00 41 00 5F 00 52 00 4F 00 4F 00 54
30 1E 17 0D 30 35 30 34 30 34 30 33 35 36 31 37 5A…

Жирным шрифтом то, что надо вывести:
52 55 – RU
04 1С 04 3E 04 41 04 ЗА 04 32 04 30 – Москва
04 1С 04 38 04 3D 04 38 04 41 04 42 04 35 04 40 04 41 04 42 04 32 04 3E 00 20 04 44 04 38 04 3D 04 30 04 3D 04 41 04 3E 04 32 00 20 04 20 04 24 – Министерство финансов РФ
04 13 04 23 04 24 04 1A – ГУФК
00 43 00 41 00 5F 00 52 00 4F 00 4F 00 54 – .C.A._.R.O.O.T.
Должно быть в поле: CA_ROOT, ГУФК, Министерство финансов РФ, Москва, RU

Заранее благодарю, Den!

Добавлено: 02 июн 2005, 17:15
Kolinus
В обчем сходу что нашел - у тебя идет 10 байт мусора ?? потом 1 байт длинны осмысленного текста потом указанное количество байт осмысоенного текста при чем каждые последовательные 2 символа представляют собой уникод код символа
мусор??? всегда начинается с 31 и ПОЧТИ всегда заканчивается на 1Е
в принципе для чтения надо использовать стек тогда твой обратный порядок превратиться в прямой.

А чем был создан файл ? Просто очень похоже что просто сериализовали какую-то сущность целиком.

Добавлено: 02 июн 2005, 17:24
Kolinus
в принципе для указанного куска млжно состряпать след алгоритм
читаешь побайтово файл пока не встретишь символ с кодом 31 дальше начинаешь проверять если через 1символ идет код 30 потом еще через 1 06 потом еще через 1идет код 55 и след 04 то устанавливаешь флажок
пропускаешь еще 2 байта читаешь длину фразы читаешь фразу указанной длины и добавляешь ее в стек , проверяешь след символ - если его код не 31 то начит ты все вычиталь или считай сколько слов считаль
удачи - она тебе пригодится ;)

Добавлено: 03 июн 2005, 12:18
Den
Ты прав Kolinus, удача пригодится! Попробую победить...
Всем спасибо за помощь.