Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение HEX из бинарника 
:(
    Опции темы
Somebody32
Дата 1.4.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Overclocker
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 2.1.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Данная тема является дополнительной к этой
Теперь вопрос в следующем, как считать данные, что находятся в файле перед записью. Т.е. мне требуется создать их бекап.

Пишу так:
Код

cg_file:=TFileStream.Create(OpenDialog1.FileName,fmOpenReadWrite);
cg_file.Position := StrToInt('$'+data.opt);
write_data := StrToInt('$'+temp_string);
cg_file.Write(write_data, SizeOf(write_data)); 


Соответственно проблема в следующем:
если запустить программу, осуществить запись, а потом строку:
Код

cg_file.Write(write_data, SizeOf(write_data)); 

на
Код

cg_file.Read(temp, SizeOf(write_data)); 


то в temp будет совсем не то, что я писал в тот раз. 

Прошу помощи, как я понял, ошибка мелочная, но никак поймать ее не могу.

PM MAIL ICQ   Вверх
MetalFan
Дата 1.4.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



ничо не понял. давай неработающий код.
а то когда ты там чего заменяешь - непонятно


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Somebody32
Дата 1.4.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Overclocker
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 2.1.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Собственно он выше.
Объясняю. Есть файл, в который по офсетам надо записать данные, запись идет прекрасно, все работает. Но появилась потребность бекапить данные перед записью, т.е сначала пробежаться по адресам, считать все, что там было, а потом уже писать.
Так вот, допустим по адресу 003F13E3 я записал 2A002A002A.
Пытаюсь считать:
Код

cg_file:=TFileStream.Create(OpenDialog1.FileName,fmOpenReadWrite);
cg_file.Position := StrToInt('$'+data.opt);
write_data := StrToInt('$'+temp_string);
cg_file.Read(temp, SizeOf(write_data));
ShowMessage(inttostr(temp));

И он мне выдает последовательность цифр совсем не похожую на 2A002A002A.
PM MAIL ICQ   Вверх
Yanis
Дата 1.4.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Сдаётся мне, что путаница у тебя возникает из-за того, что в HEX виде твои данные «смотрятся» наоборот.

Добавлено через 31 секунду
Выложи полный код. С типа переменных!


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Somebody32
Дата 1.4.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Overclocker
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 2.1.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Код

procedure TForm1.Button3Click(Sender: TObject);
  var
  cg_file: TFileStream;
  patch_file: TextFile;
  patch_data_string, temp_string : String;
  data : TPatchOption;
  write_data,write_time,extra_symb,i,temp : integer;

begin
  if not TestUndoData then
    ShowMessage('Файл патча не содержит информации для восстановления. Она будет сгенерирована автоматически.');
  cg_file:=TFileStream.Create(OpenDialog1.FileName,fmOpenReadWrite);
  AssignFile(patch_file,OpenDialog2.FileName);
  Reset(patch_file);

    while(not eof(patch_file)) do
   begin
    Readln(patch_file,patch_data_string);
    data := GetOpt(patch_data_string,':');
    //ShowMessage(data.opt+' '+data.value);
    cg_file.Position := StrToInt('$'+data.opt);
    if length(data.value) >8 then
      begin
        write_time:=ceil(length(data.value)/8)-2;
        extra_symb:=length(data.value)-write_time*8;
        for i := 0 to write_time do
          begin
            temp_string := copy(data.value,i*8,8);
            //ShowMessage(temp_string+'!');
            write_data := StrToInt('$'+temp_string);
            //cg_file.Write(write_data, SizeOf(write_data));
            cg_file.ReadBuffer(temp,SizeOf(write_data));
            ShowMessage(inttostr(temp));
          end;
        temp_string := copy(data.value,(write_time+1)*8+1,extra_symb);
        ShowMessage(temp_string);
       // write_data := StrToInt('$'+temp_string);
        //cg_file.Write(write_data, SizeOf(write_data));
      end
    else
      begin
        write_data := StrToInt('$'+data.value);
        cg_file.Write(write_data, SizeOf(write_data));
      end;
   end;
   ShowMessage('Патч применен успешно!');
  closefile(patch_file);
  cg_file.Free;
end;

PM MAIL ICQ   Вверх
tht
Дата 2.4.2007, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 10.5.2006

Репутация: нет
Всего: 1



а ты не мог бы показать строку HEX данные который ты записываешь и те данный которые тебе удается прочитать ? я бы тогда точно понял что у тебя за проблема.
PM MAIL   Вверх
MetalFan
Дата 2.4.2007, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Somebody32, и на основе каких данных ты делаешь вывод о " неправильной" записи?
делаешь Write, потом сразу Read и не то получаешь? ну так правильно тогда все...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Somebody32
Дата 2.4.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Overclocker
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 2.1.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



MetalFan, естественно я прогу перезапускаю.

tht, пишу  по офсету 003F13E3 данные 2A002A002A, а получаю: 704653824
PM MAIL ICQ   Вверх
Yanis
Дата 2.4.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Если переведёшь 704653824, то кое что заметишь. Значит ты где то глючишь smile

Добавлено через 2 минуты и 57 секунд
Что то меня смущает отсутсвие seek в коде smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Somebody32
Дата 2.4.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Overclocker
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 2.1.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



WinHex'ом  перевел это в HEX, оказалось то, что надо, как теперь только программно это в хекс перегнать?
PM MAIL ICQ   Вверх
Yanis
Дата 2.4.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Ответ подкупающий своей неожаднностью -- с помощью IntToHex.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Somebody32
Дата 2.4.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Overclocker
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 2.1.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Yanis
Код

cg_file.Position := StrToInt('$'+data.opt);


это его аналог

Добавлено через 5 минут и 7 секунд
Yanis, да, что-то совсем косячить стал, спасибо, работает.
PM MAIL ICQ   Вверх
Yanis
Дата 2.4.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Цитата(Somebody32 @  2.4.2007,  20:40 Найти цитируемый пост)
это его аналог

Я бы сказал, что это его противоположность smile

Цитата(Somebody32 @  2.4.2007,  20:40 Найти цитируемый пост)
спасибо, работает. 

smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Somebody32
Дата 2.4.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Overclocker
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 2.1.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



еще вопрос появился, 
если пишу это: 00002A002A002A002A, то, как видно из кода выше - пишу макс по 8 символов, иначе Strtoint выпадает с ошибкой, то, при чтении - нули урезаются, т.е мне выдается 2A002A002A02A. что с этим делать?
PM MAIL ICQ   Вверх
Yanis
Дата 2.4.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Потому что 8 символов в HEX, это 4 байта. А 4 байта это максимальная размерность целого числа. Так что делай выводы.
Зачем тебе вообще числа? Используй обычные буферы типа массива символов.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1399 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.