Что нового

Массовая замена в бинарном файле по приращению номера смещения как?

dixxia

Новичок
Сообщения
7
Репутация
0
Добрый день всем! Я открываю в HEX редакторе бинарный файл, конкретно сейчас в HEX EDITOR NEO, но не суть, возможно намного легче будет а autoit.
Этот файл - это библиотека звуков с синтезатора Ямаха. В этом файле сохранено 128 звуков со своими настройками (в частности, настройки темпа - и они все разные). Мне часто нужно чтобы все звуки имели один темп. Задолбался уже вручную на синтезаторе вводить новые значения на каждый звук и сохранять. проще массово поменять все в самом файле и загрузить его уже с новыми настройками темпа для каждого звука обратно в синт. В бинарном файле ячейка отвечающая за темп первого звука находится в ячейке с номером 101 (я смещение выставляю в редакторе в десятичном виде), у второго звука это ячейка 202, у 3-го - 303... и так далее, через каждый 101й адрес. (здесь 101 для простоты, на самом деле другое число может быть). Как я могу автоматизировать этот процесс? то есть нужен скрипт который позволяет задать номер первого адреса, в котором нужно заменить его значение на 25 (например), и далее, менять значение ячейки через каждый 101й адрес (номер ячейки)?
 

InnI

AutoIT Гуру
Сообщения
4,969
Репутация
1,459
Пробуйте.
Если некорректно, то приложите файлы: исходный и с вашими ручными правками.
Код:
$Path = @ScriptDir & "\test.bin" ; путь к исходному файлу
$Dest = @ScriptDir & "\dest.bin" ; путь к файлу с результатом

$Shift = 234 ; смещение от начала файла
$Offset = 100 ; смещение между заменами
$Value = "25" ; значение (hex в виде строки без 0x)

If Not FileExists($Path) Then Exit MsgBox(0, @ScriptName, "File not found '" & $Path & "'")

$File = FileOpen($Path, 16)
$Data = StringTrimLeft(FileRead($File), 2)
FileClose($File)

$Begin = StringLeft($Data, $Shift * 2)
$Data = StringTrimLeft($Data, $Shift * 2)
$Data = StringRegExpReplace($Data, "(.{" & $Offset * 2 & "})..", "${1}" & $Value)

$File = FileOpen($Dest, 2 + 16)
FileWrite($File, Binary("0x" & $Begin & $Data))
FileClose($File)
 
Последнее редактирование:
Автор
D

dixxia

Новичок
Сообщения
7
Репутация
0

InnI

Спасибо большое!!! Работает. Будете в Калининграде, пишите, с меня сувенир! Вы не могли бы добавить строку, которая указывает, что заменять нужно не с самой первой ячейки( не с начала файла) а например с 234й?
Сообщение автоматически объединено:

Пробуйте.
Если некорректно, то приложите файлы: исходный и с вашими ручными правками.
Код:
$Path = @ScriptDir & "\test.bin" ; путь к исходному файлу
$Dest = @ScriptDir & "\dest.bin" ; путь к файлу с результатом

$Offset = 100 ; смещение
$Value = "25" ; значение (hex в виде строки без 0x)

If Not FileExists($Path) Then Exit MsgBox(0, @ScriptName, "File not found '" & $Path & "'")

$File = FileOpen($Path, 16)
$Data = StringTrimLeft(FileRead($File), 2)
FileClose($File)

$Data = StringRegExpReplace($Data, "(.{" & $Offset * 2 & "})..", "${1}" & $Value)

$File = FileOpen($Dest, 2 + 16)
FileWrite($File, Binary("0x" & $Data))
FileClose($File)

@InnI

Спасибо большое!!! Работает. Будете в Калининграде, пишите, с меня сувенир! Вы не могли бы добавить строку, которая указывает, что заменять нужно не с самой первой ячейки( не с начала файла) а например с 234й?
 

InnI

AutoIT Гуру
Сообщения
4,969
Репутация
1,459
заменять нужно не с самой первой ячейки( не с начала файла) а например с 234й
Внёс изменения в исходный скрипт. Добавил смещение от начала файла. Таким образом первая замена будет в ячейке $Shift + $Offset.
 
Последнее редактирование:
Автор
D

dixxia

Новичок
Сообщения
7
Репутация
0
Внёс изменения в исходный скрипт. Добавил смещение от начала файла. Таким образом первая замена будет в ячейке $Shift + $Offset.
Спасибо!!! Это пригодилось.
выявилась проблема с этими файлами. (дампами звуковых библиотек синтезатора).
Как то у них нет общей нормальной структуры.
стал подробнее исследовать файл и выяснилось что (ощущение что японцы вообще без всякой структуризации писали алгоритм сохранения, без четкой структуры)...
в файле 128 звуков.
Схематически он состоит из 128 блоков Soundlayer (описание настройки звукового патча) плюс несколько блоков в начале и в конце (служебные - заголовок, еще чтото, еще чтото......)
Блок Soundlayer может быть разного размера. И......(бл..ди.японцы!!!)......ячейки темпа в этом блоке тоже не всегда на одном расстоянии от начала блока.
Я хочу сделать txt файл Soundlayer.txt (в нем будет список номеров ячеек (адрес начала блока Sound layer) - много строк (128 например), в каждой строке указан номер начала блока. (Я изучаю файл в HEX редакторе, и за начало каждого блока принимаю адрес (номер) ячейки с которого начинается название звука). И сделать txt файл Offset.txt ( в нем так же в строчку будет указано число (смещение от начала блока Soundlayer до ячейки, в которой нужно поменять темп.
Идеально если сделать еще файл Temp.txt (из него бы брались значения темпа для каждого Soundlayer-а). Мне вообще-то нужен один темп на все звуки, но, например темп 120 bpm и темп 60 bpm (в два раза меньше или больше) отлично совмещаются друг с другом. Поэтому часть звуков я устанавливаю, например в 120 bpm, а часть в 60 или 240bpm.
Soundlayer.txt Offset.txt Temp.txt
345 134 60
728 128 120
1155 133 60
1489 126 240
...... и т.д. ...... и т.д. ...... и т.д.

скрипт берет из 1й строки Soundlayer.txt адрес 1го блока (345), прибавляет к этому значению число из 1й строки Offset.txt(134) , получается 479, и заменяет по адресу 479 значение из первой ячейки Temp.txt(60).
 

InnI

AutoIT Гуру
Сообщения
4,969
Репутация
1,459
С подобной хотелкой вам лучше обратиться в "Стол заказов"
 
Автор
D

dixxia

Новичок
Сообщения
7
Репутация
0
стрелками указал начало одного блока и начало следующего. Каких то одинаковых тэгов(заголовков, меток) перед ними нет, так же как и к ячейке(ячейках) в которой указана скорость. только сейчас выяснил что значения скорости устанавливаются в нескольких ячейках друг за другом (в 8).

НЕ знаю как перенести в Стол заказов. Создать новую тему там, а эту удалить-закрыть?
 

Вложения

  • Безымянный-1.jpg
    Безымянный-1.jpg
    2.2 МБ · Просмотры: 3
  • 2.jpg
    2.jpg
    2 МБ · Просмотры: 3

InnI

AutoIT Гуру
Сообщения
4,969
Репутация
1,459
Создать новую тему там, а эту удалить-закрыть?
Там создать новую тему с подробным описанием. Желательно приложить файлы в качестве примеров.
Эту тему лучше оставить. Может кому пригодится.
Сообщение автоматически объединено:

Кстати, есть ещё такой раздел
 
Автор
D

dixxia

Новичок
Сообщения
7
Репутация
0
Там создать новую тему с подробным описанием. Желательно приложить файлы в качестве примеров.
Эту тему лучше оставить. Может кому пригодится.
Сообщение автоматически объединено:

Кстати, есть ещё такой раздел
Спасибо!!!
 
Верх