Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2009, 15:35   #1
Lvenok1987
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 14
По умолчанию Замена байта по заданному смещению

Требуется по заданному смещению, заменить один байт на другой.

Код поиска нужного нам байта:
Код:
f.Seek(i,soFromBeginning);
  f.Read(s,sizeof(s));
  t:=IntToHex(s, 2);
    if (t='6B')
     then
        a:=a+(IntToHex(144, 2)+' ')
                else
                    a:=a+(IntToHex(s, 2)+' ');
Проблема в том, что любой найденный байт "6В" заменяется на нужный нам байт "90".
Смещение, в котором находится данный байт: "00А0". Каким образом программе указать, что именно в данном смещении, нужно найти схожий байт, и заменить его на нужный...?
Lvenok1987 вне форума Ответить с цитированием
Старый 16.11.2009, 16:15   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

f.Seek(смещение,soFromBeginning(отк уда отсчитывать));
Вы ведь в i указываете смещение?
mihali4 вне форума Ответить с цитированием
Старый 16.11.2009, 17:00   #3
Lvenok1987
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 14
По умолчанию

С HEX-ом работаю в 1-й раз, поэтому вопросы могут показаться до простоты идиотскими, заранее извиняюсь.

Взял исходники HEX-редактора. В 1-м столбце выводится адрес смещения, во 2-м байты, в 3-м еще что-то.

Смещение мы выводим таким образом:
Код:
 
for i := 0 to f.Size-1 do
c:=c+IntToHex(i, 4)+#13#10;
Выводится строка типа: 10A0.

Пример.
По адресу смещения "0090", мы хотим заменить байт "6В" на какой-либо.
"0090" - адрес, переводим в 2-ю систему, это у нас будет "144".
Если написать:
Код:
f.Seek(144,0);
, то выводится белеберда...
Я скорее всего не могу понять, как правильно задать смещение и откуда отсчитывать...

В справочной Delphi нашел вот это:
Код:
 Stream1.Seek(60, 0); { Move to byte 60}
. Это как понять "смещаемся к байту 60"?
Lvenok1987 вне форума Ответить с цитированием
Старый 16.11.2009, 17:13   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Это как понять "смещаемся к байту 60"?
Эта команда передвигает указатель позиции в файле на 60-тый байт.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.11.2009, 17:18   #5
Lvenok1987
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Эта команда передвигает указатель позиции в файле на 60-тый байт.
Примерно понятно, но не понятно как в моей задаче перейти к этомй байту, зная адрес смещения. Напротив смещения, выводится 16 чисел, и вот реди этих 16-ти чисел, есть нужный нам байт. Тогда получается адрес смещения, к-й выводится у меня в 1-м столбце - это совсемне то?

Разобрался, пишем просто порядковый номер байта, в строке, тоесть: 0099 (он у меня 9й по счету).

Последний раз редактировалось Lvenok1987; 16.11.2009 в 17:21.
Lvenok1987 вне форума Ответить с цитированием
Старый 16.11.2009, 18:05   #6
Lvenok1987
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 14
По умолчанию

Так, нажав кнопку, по заданному адресу у нас заменяется какой-либо байт на "3А".

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
f:tfilestream;
s:byte;
a,i,t:integer;
begin
if opendialog1.Execute then
  begin
 f:=tfilestream.Create(opendialog1.FileName,fmopenRead);
            f.Seek(1,soFromBeginning);
            f.Write('3A',sizeof('3A'));
 f.Free;
  end;
end;
В данном случае, 2-й байт по счету, если смотреть через любой HEX-редактор, меняется на "3А"...точнее он по задумке должен меняться, но не меняется...в чем ошибка?
Lvenok1987 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение младшего и старшего байта числа. spamer Общие вопросы Delphi 10 17.04.2009 15:43
Когда отправляю tStream, теряю 4 байта. Altera Работа с сетью в Delphi 3 19.03.2009 19:05
Замена кода программы с Delhi5 на Delhi7 либо замена базы данных с Acessa на MySQL DorianLeroy Фриланс 8 18.02.2009 18:52
взятие старшего и младшего байта Djaconda Общие вопросы Delphi 2 29.09.2008 09:25
Вывод байта в двоичном пердставлении (С++) trollik Помощь студентам 6 01.09.2008 23:55