Различия в чтении в шестнадцатеричном формате
Когда я открываю файл .m4a в программе шестнадцатеричного редактора (например, HxD), он дает мне другие шестнадцатеричные данные, чем те, что я получаю из своего скрипта Python.
Чтение с Python
Это то, что я вижу в Python, показывая первые 32 символа:
with open('01 Choir (Remix).m4a', 'rb') as f:
content = f.read().hex()
print(content[:32])
00000020667479704d34412000000000
Чтение с xxd
Использование bash, снова выбирая первые 32 символа:
$ xxd -ps 01\ Choir\ \(Remix\).m4a | head -c 32
00000020667479704d34412000000000
Здесь xxd -ps
получает шестнадцатеричную строку файла, а head получает первые 32 символа этого вывода.
Обратите внимание, что они одинаковыhex.
Переписывание Hex
Следующая строка, которую мне нужно отредактировать (из моего редактора hex)
0000018068693332
заменить на:
0000000068693332
У вас была половина решения - просто замените строку и перепишите в файл. Имейте в виду, что хотя библиотека регулярных выражений Python, re , более мощная, она также не является необходимой, поскольку все, что вам нужно сделать, - это заменить строку. А замена строк на на порядок быстрее , чем при использовании регулярных выражений.
Если вам нужно использовать регулярное выражение, существует множество способов Редактировать Hex .
# replace_bytes.py
source_str = '0000018068693332'
replace_str = '0000000068693332'
with open('01 Choir (Remix).m4a', 'rb') as f:
content = f.read().hex()
print(source_str + " in `01 Choir (Remix).m4a`: ", source_str in content)
content = content.replace(source_str, replace_str)
with open('01 Choir (Remix) edited.m4a', 'wb') as f:
f.write(bytes.fromhex(content))
with open('01 Choir (Remix) edited.m4a', 'rb') as f:
new_content = f.read().hex()
print(source_str + " in `01 Choir (Remix) edited.m4a`:", source_str in new_content)
Затем запустите его:
$ python replace_bytes.py
0000018068693332 in `01 Choir (Remix).m4a`: True
0000018068693332 in `01 Choir (Remix) edited.m4a`: False