информация из файла
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Привет участникам форума!
Не так давно на форуме я задавал вопрос по поводу перекодировщика и доставания программным путем нужной информации из бинарного файла, используя его в шестнадцатеричном виде. И записи информации в поля диалогового окна.
Перекодировщик я сделал. Прекрасно работает. Например:
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!
Не так давно на форуме я задавал вопрос по поводу перекодировщика и доставания программным путем нужной информации из бинарного файла, используя его в шестнадцатеричном виде. И записи информации в поля диалогового окна.
Перекодировщик я сделал. Прекрасно работает. Например:
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!
Лично мне вопрос не понятен совершенно (если честно)
что вообще содержится в файле?
МОт стоит выложить кусок файла?
ЗЫ 12 у тебя в 16-ричном посему в 10 ричном енто 18 (или я опять не так понял ??)
что вообще содержится в файле?
МОт стоит выложить кусок файла?
ЗЫ 12 у тебя в 16-ричном посему в 10 ричном енто 18 (или я опять не так понял ??)
В SAD - все в SAD.
Код: Выделить всё
unsigned char szBuf[] = {0x04, 0x1E, 0x04, 0x42, 0x04, 0x34, 0x04, 0x35, 0x04, 0x3B, 0x00, 0x20, 0x04, 0x1E, 0x04, 0x11, 0x04, 0x18};
Код: Выделить всё
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.
Kolinus, верно 12 в 16-ричном это 18 в 10-ричном. Кусок выложу позже, сейчас нет под рукой. Так сложилось.
WinMain, к сожалению не знал ф-ции WideCharToMultiByte(). Поэтому банально на С++ писал перекодировщик. Ты писал, что данные перед строкой, это скорее всего какие-то четырёхбайтовые числовые значения типа int, long или float.
Хорошо, но как их использовать для получения нужной информации, наложения фильтра ...
Благодарен вам за сотрудничество!
WinMain, к сожалению не знал ф-ции WideCharToMultiByte(). Поэтому банально на С++ писал перекодировщик. Ты писал, что данные перед строкой, это скорее всего какие-то четырёхбайтовые числовые значения типа int, long или float.
Хорошо, но как их использовать для получения нужной информации, наложения фильтра ...
Благодарен вам за сотрудничество!
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!
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!
В обчем сходу что нашел - у тебя идет 10 байт мусора ?? потом 1 байт длинны осмысленного текста потом указанное количество байт осмысоенного текста при чем каждые последовательные 2 символа представляют собой уникод код символа
мусор??? всегда начинается с 31 и ПОЧТИ всегда заканчивается на 1Е
в принципе для чтения надо использовать стек тогда твой обратный порядок превратиться в прямой.
А чем был создан файл ? Просто очень похоже что просто сериализовали какую-то сущность целиком.
мусор??? всегда начинается с 31 и ПОЧТИ всегда заканчивается на 1Е
в принципе для чтения надо использовать стек тогда твой обратный порядок превратиться в прямой.
А чем был создан файл ? Просто очень похоже что просто сериализовали какую-то сущность целиком.
В SAD - все в SAD.
в принципе для указанного куска млжно состряпать след алгоритм
читаешь побайтово файл пока не встретишь символ с кодом 31 дальше начинаешь проверять если через 1символ идет код 30 потом еще через 1 06 потом еще через 1идет код 55 и след 04 то устанавливаешь флажок
пропускаешь еще 2 байта читаешь длину фразы читаешь фразу указанной длины и добавляешь ее в стек , проверяешь след символ - если его код не 31 то начит ты все вычиталь или считай сколько слов считаль
удачи - она тебе пригодится
читаешь побайтово файл пока не встретишь символ с кодом 31 дальше начинаешь проверять если через 1символ идет код 30 потом еще через 1 06 потом еще через 1идет код 55 и след 04 то устанавливаешь флажок
пропускаешь еще 2 байта читаешь длину фразы читаешь фразу указанной длины и добавляешь ее в стек , проверяешь след символ - если его код не 31 то начит ты все вычиталь или считай сколько слов считаль
удачи - она тебе пригодится

В SAD - все в SAD.
Ты прав Kolinus, удача пригодится! Попробую победить...
Всем спасибо за помощь.
Всем спасибо за помощь.