Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 22

Замена hex по адресу

25.02.2015, 09:00. Показов 4262. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть такая задача:
Имеем некий файл (скажем bin), необходимо внести изменения (взятые из поля edit диалога) по определенному адресу.
Например есть:
Code
1
2
3
4
5
....
00010a20 - 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00010a30 - 00 01 02 03 04 05 06 07  08 00 00 00 00 00 00 00
00010a50 - 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
....
Необходимо внести изменения только по адресу 00010a30, например:
Code
1
00010a30 - 00 1a 2b 3c 11 22 33 44  55 00 00 00 00 00 00 00.
Я новичок в программировании, основную часть программы написал - сам диалог, открытие и закрытие файла, а вот с редактированием конкретной части файла загвоздка.... Может есть какое-нибудь готовое решение?
Спасибо.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2015, 09:00
Ответы с готовыми решениями:

Поиск и замена числа в HEX
Доброго времени суток, прошу прощения, если возникший вопрос задаю не в тот раздел форума. Подскажите, пожалуйста, как найти число 604 в...

Чтение и запись по HEX-адресу
Приветствую всех! Есть задача: скажем, есть некий файл такого вида (в HEX): 0x00000000: 00 AB 87 09 67 C0 AA F0 A7 ... Как реализовать...

Замена hex значений
Читаю файл вот так: procedure ReadFileAsHex(const AFileName: string; ADestination: TStrings); var fs: TFileStream; buff: Byte; ...

37
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
25.02.2015, 09:21
BiNaRs, кто мешает взять да записать в файл нужный байт по адресу 00010a30?
Т.к я не знаю какой файловый i/o использован, всё будет выглядеть примертно так
C++
1
fwrite(file, ourByte, 1, 0x00010a30);
1
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
25.02.2015, 18:34
но сначала fopen(....), затем fseek(нужный_адрес), и во тогда уже fwrite(...)
1
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 22
26.02.2015, 06:01  [ТС]
Спасибо вам за направление в нужную сторону.
Сделал так - сперва указал нужный адрес:
C++
1
SetFilePointer(hFile, 0x10a30, NULL, FILE_BEGIN);
Затем записал что необходимо:
C++
1
2
int ms = 0x1a2b3c44;
WriteFile(hFile, &ms, sizeof(ms), &dwBytesWrite, NULL);
Только теперь 2 проблемы. 1) - запись идет в обратном порядке, как ее "развернуть"?. 2) Из поля Edit диалога получаю целое число, как его преобразовать в hex для дальнейшей записи в файл?
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
26.02.2015, 06:10
Цитата Сообщение от BiNaRs Посмотреть сообщение
1) - запись идет в обратном порядке, как ее "развернуть
C++
1
2
3
4
5
6
7
DWORD __fastcall RevertDWord(DWORD dwValue)
{
   return ((dwValue & 0x000000FF) << 24) |
          ((dwValue & 0x0000FF00) <<  8) |
          ((dwValue & 0x00FF0000) >>  8) |
          ((dwValue & 0xFF000000) >> 24);
}
2) Из поля Edit диалога получаю целое число, как его преобразовать в hex для дальнейшей записи в файл
Какой еще "hex" в бинарном файле?
1
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 22
26.02.2015, 07:53  [ТС]
Я может не правильно выражаюсь, говорю же новичок...
В поле Edit вводится число, например - 112233.
А в файл необходимо записать - 0x112233.
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
26.02.2015, 08:13
Цитата Сообщение от BiNaRs Посмотреть сообщение
неправильно выражаюсь
Угу, неправильно. У вас в Edit Hex. Используйте strtol с base = 16.
1
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 22
26.02.2015, 11:00  [ТС]
Теперь все ясно, всем спасибо!

Добавлено через 2 часа 35 минут
Хотя нет, опять засада.
Из поля Edit получаю int f = 112233, если его прямо так записать в файл то получается мусор типа - CC CC CC.
Если записывать так - int f = 0x112233, то записывается как положено.
Так вот, как к полученному из Editа int f = 112233 добавить заветные 0x, чтобы все правильно записалось?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
26.02.2015, 11:17
Покажи как с edit'а вытягиваешь строку и как в hex преобразуешь.
0
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 22
26.02.2015, 11:20  [ТС]
C++
1
2
int f;
GetDlgItemInt(hwnd, IDC_EDIT1, &f, FALSE);
Цитата Сообщение от Enno Посмотреть сообщение
как в hex преобразуешь.
Я об этом и спрашиваю, как это сделать?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
26.02.2015, 11:50
Так ты не строку считываешь, а целое. Не нашёл упоминания о вариантах основания. Считай строку, переведи в целое по основанию 16.
0
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 22
27.02.2015, 07:21  [ТС]
И так, продолжаем изучать...
Считал строку из IDC_EDIT1:
C++
1
2
TCHAR buffer[MAX_PATH];
GetDlgItemText(hwnd, IDC_EDIT1, buffer, MAX_PATH);
Далее использую strltol с base 16, чтобы получить заветные 0x перед числом которое ввожу в IDC_EDIT:
C++
1
2
char *pStr;
int str = strtol(buffer, &pStr, 16);
Затем записываю:
C++
1
2
    SetFilePointer(hFile, 0x10a30, NULL, FILE_BEGIN);
WriteFile(hTempFile, &str, sizeof(str), &dwBytesWritten, NULL);
В итоге если вписываю в поле edit - 11223344, то все правильно:
Code
1
00010a30 - 44 33 22 11 00 00 00 00  00 00 00 00 00 00 00 00
А если вписываю больше цифр - 1122334455, то получаю мусор:
Code
1
00010a30 - FF FF FF 7F 00 00 00 00  00 00 00 00 00 00 00 00
Почему только 8 цифр правильно записываются?
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
27.02.2015, 07:47
Цитата Сообщение от BiNaRs Посмотреть сообщение
только 8 цифр
Потому, что размер DWORD - 8 bytes.

У вас изначально неверный подход к задаче. Если речь идет о замене подстроки произвольного размера, то и работать надо со строкой: получить строку в Hex, побайтно конвертировать Hex в BYTE и перезаписать изменяемые байты.
1
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 22
27.02.2015, 10:31  [ТС]
Может приведете небольшой примерчик...?
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
27.02.2015, 10:35
Цитата Сообщение от BiNaRs Посмотреть сообщение
небольшой примерчик
HEX в BIN
1
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 22
27.02.2015, 12:53  [ТС]
Теперь я что-то запутался...
Получить строку в hex - это так как я выше написал? с помощью strtol?
Побайтно конвертировать hex в byte из скачанного примера при помощи MakeSigByte, так?
а если надо по 2 байта переворачивать, то есть беру из idc_edit 123456, и необходимо записать так:
Code
1
00010a30 - 21 43 65 00 00 00 00 ...
?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
27.02.2015, 13:08
123456
56 34 12
Читай про порядок байт в многобайтовых значениях.
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
27.02.2015, 15:02
Цитата Сообщение от BiNaRs Посмотреть сообщение
а если надо по 2 байта переворачивать
Что за страсть к извращениям? То по восемь, то по два...

Работаем с символьной (Hex) строкой и конвертируем в массив байт. Два Hex-символа - это один байт (от 00 до FF).

C++
1
2
3
4
   for (DWORD ii = 0; ii < dwSize; ii += 2)
   {  
      fprintf(pOut,"%c",MakeSigByte((char*)&pBuf[ii]));
   }
Читаем массив парами и конвертируем. Что неясно - смотрим в отладчике.
1
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 22
01.03.2015, 09:42  [ТС]
Все записывается, но записывается так, как я ввожу в idc_edit. то есть если я пишу 123456... то и записывается так же:
Code
1
00010a30 - 12 34 56 00 00 00 00 ...
А как каждый байт развернуть? чтобы вышло:
Code
1
00010a30 - 21 43 65 00 00 00 00 ...
И второй вопрос, WriteFile записывая затирает то, что было ранее по этому адресу, а можно ли как то сделать чтобы текст сдвигался вниз. То есть если в файле есть адрес 10a30 с каким-то значением, после того как я запишу что-то по этому адресу, то то что было ранее (по этому адресу) перешло на адрес 10a40?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
01.03.2015, 14:50
Цитата Сообщение от BiNaRs Посмотреть сообщение
А как каждый байт развернуть?
Тебе число надо записать или результат преобразования?
Цитата Сообщение от BiNaRs Посмотреть сообщение
чтобы текст сдвигался вниз.
Считать этот текст и записать его чуть дальше.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.03.2015, 14:50
Помогаю со студенческими работами здесь

Hex редактирование - замена строк в файле
Есть файл (вернее 3d модель) в котором нужно сменить имя текстуры, при помощи Free Hex Editor Neo это можно спокойной делать: грузите...

Поиск и замена hex значения в RAM
Подскажите, как написать скрипт для WinHex, чтобы открыть определенный процесс в оперативной памяти, найти определенное hex значение и...

Замена символов в 16-ричном HEX коде программы
Всем привет! Ребята Хелп подскажите пожалуйста как заменить какой командой вот эти три позиции с того что там на скрине в красных...

Если HEX одного файла заменить на HEX другого, то изменится ли файл и будет ли работоспособным?
Привет, если два файла a.exe(калькулятор) и b.exe(выводит строку &quot;Hello World&quot;) Если открыть файл b.exe в HEX-редакторе и подменить его...

ASCII to HEX, HEX to Binary/Assembly 8086
Люди добрые, есть проблема, надо написать программу которая получает с клавиатуры какие-нибудь символы, например: Ab10 и печатает на экране...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru