Что нового

Чтение, замена и запись бинарных данных

[email protected]

Новичок
Сообщения
15
Репутация
0
Доброго дня господа.

Требуется ваша помощь. Нужен готовый (или почти готовый) скрипт на работу с файлами в бинарном виде. Я что-то ничего не увидел по поиску, хотя может плохо искал.
Чуток есть в теме "Извлечение исходных данных + перенос в бинарные данные", часть есть в - "Читаем бинарные данные в структуру". Но это не совсем то ...

Короче ... Задача ....

Читаем с файла бинарные данные, пока не встретим строку "??0100000003??????5900??01000000" (?? - любые данные).
Как только найдена, от начала этой строки, читаем 7 байт (здесь тот, который после 03 и помечен ??).
Если он равен 05, выполняем "условие 1". Если равен 15 - "условие 2". Если другое значение, читаем дальше, пока не закончим.

"условие 1"
меняем значение с текущего (с 7-го байта) "0305??????5900??01000000" на "0305??????59004141909090" и записываем новое значение в этот же файл, на это же место.

"условие 2"
меняем значение с текущего (с 7-го байта) "0315??????5900??01000000" на "0315??????5900B801000000" и записываем новое значение в этот же файл, на это же место.

Таких кусков может быть много.


Если реально это реализовать, подскажите как или ткните носом, куда нужно ...
Если нереально, заранее извиняюсь за отнятое у вас время.

Спасибо.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
в бинарных данных нет строк. точнее там одна строка.
как то писал код для изменения прошивки для чипов лазерных картриджей. там просто. прошивка половину мб весит. всю в память считал и изменил данные. да и данные все были в одном месте. если считать байты сначала . конкретно назначил какой по счету байт менять и все.
если файл большой, очень большой, то в память не загрузишь его. точнее, ОЗУ нужно прилично. а так через регулярные выражения искать совпадения.
не ломалку, случайно, пишем? :smile: тут такое не приветствуется
может есть файл для примера?
 
Автор
M

[email protected]

Новичок
Сообщения
15
Репутация
0
joiner сказал(а):
в бинарных данных нет строк. точнее там одна строка.
как то писал код для изменения прошивки для чипов лазерных картриджей. там просто. прошивка половину мб весит. всю в память считал и изменил данные. да и данные все были в одном месте. если считать байты сначала . конкретно назначил какой по счету байт менять и все.
если файл большой, очень большой, то в память не загрузишь его. точнее, ОЗУ нужно прилично. а так через регулярные выражения искать совпадения.
не ломалку, случайно, пишем? :smile: тут такое не приветствуется
может есть файл для примера?

Ну конечно я указал не строки. это набор байтов - 03 ?? 05 ?? 00
Читать весь в память не нужно - лучше наверно читать кусками длиной х байт в один и тот же буфер памяти (так памяти съест минимум).
А разве я что-то упоминул про ломалку? набор байт чисто произвольный, что в голову пришло. может быть и так: FF FF FF EF FF AE
какая разница ...
Задача ясная - нужно бинарный блок определенных данных поменять на другой. и все. Для ломалок есть более подходящие и простые инструменты.
 
Автор
M

[email protected]

Новичок
Сообщения
15
Репутация
0
Спасибо! начало есть ...
Что нужно добавить для условий, какие я указал? В этой теме явная замена А на Б. А у меня может вместо А быть и У и П и М ... а менять надо все на Б.
 

InnI

AutoIT Гуру
Сообщения
4,949
Репутация
1,443
[email protected]
Что нужно добавить для условий
Я так понимаю, найти "строку" по шаблону
Код:
StringRegExp()
прочитать байт
Код:
StringMid()
выполнить замену в "подстроке" по условию байта и заменить в файле исходную "строку" на полученную, как в той теме.
 
Автор
M

[email protected]

Новичок
Сообщения
15
Репутация
0
Спасибо большое!
Последний вопрос .... как-то сразу из виду упустил ...
Например ищем что-то типа ...

$hexFind="0305??????00??01000000"

нашли такую - 0305182A49006101000000

как только найденно, как мне сохранить временно всю строку на время в какой-то буфер?
чтобы знать какие данные в данный момент находятся после 0305? выше видно - это 182A490061
 

InnI

AutoIT Гуру
Сообщения
4,949
Репутация
1,443
[email protected]
как мне сохранить временно всю строку
Да как угодно: запишите в переменную или в массив, сохраните в файл, создайте структуру...
Функция StringRegExp() с установленным flag = 3 (третий параметр) возвращает готовый массив вхождений - все найденные строки уже сохранены в его элементах.
 
Автор
M

[email protected]

Новичок
Сообщения
15
Репутация
0
Большое спасибо. Бум пытаться ...


Добавлено:
Сообщение автоматически объединено:

Ну еще кто-то поучаствует в дискуссии?
Задача до конца так и не решена ...

Может кто поделиться ссылкой на заморские порталы, где подобный вопрос разбирался в примерах. А то тут - ничего. Только работа с текстом.
 
Верх