我正在尝试编辑.m4a文件(音频文件)中的特定行数据,但我无法在python中找到一种方法。我知道还有其他类似的线程,但是当我在十六进制编辑器程序(例如,HxD)中打开一个HxD文件时,它给出的十六进制数据与我从python中得到的数据不同。我有点被术语搞糊涂了。我需要做的是用python读取文件,并将其转换为我的十六进制编辑器使用的格式,替换数据,然后将其转换回来并将其写入文件。我真的不知道这是否有可能,或者是否有更简单的方法。我还是Python新手,所以我还在学习。我真的需要有人为我指明正确的方向。这样做的原因与我试图更改的文件的元数据有关。
我的python版本:Python3.7.4
下面是一个指向该文件的链接:I00MFT1IyltTAvxntF/view?usp=共享
我的代码:
with open(file, 'rb') as f:
content = f.read().hex()
print(content)
下面是我需要编辑的行(从我的十六进制编辑器)
00 00 01 80 68 69 33 32
(文本翻译:����hi32)
代之以:
00 00 00 00 68 69 33 32
我的文件在十六进制编辑器中的开头如下所示(HxD):
00 00 00 00 00 00 00 00 01 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 01 0C 60 6D 64 69 61 00 00 00 20 6D 64 68 64 00 00 00 00 D9 98 96 40 D9 B2 F7 52 00 00 AC 44 00 84 EC 00 00 00 00 00 00 00 00 22 68 64 6C 72 00 00 00 00 00 00 00 00 73 6F 75 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0C 16 6D 69 6E 66 00 00 00 10 73 6D 68 64 00 00 00 00 00 00 00 00 00 00 00 24 64 69 6E 66 00 00 00 1C 64 72 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 75 72 6C 20 00 00 00 01 00 01 0B DA 73 74 62 6C 00 00 80 76 73 74 73 64 00 00 00 00 00 00 00 01 00 00 80 66 6D 70 34 61 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 02 00 10 00 00 00 00 AC 44 00 00 00 00 00 33 65 73 64 73 00 00 00 00 03 80 80 80 22 00 00 00 04 80 80 80 14 40 15 00 18 00 00 04 82 90 00 03 E8 00 05 80 80 80 02 12 10 06 80 80 80 01 02 00 00 00
我从Python脚本中获得的十六进制的开头如下所示:
d5df0d0ef02daf279fd6b15fae5c6e0bc79bec22095ceeada5e77371afc8ee36f10773b1b2c06b1b1ee4e5cccbf67403b26fd37cc6e3cc9f11019ab604f0071872ec6c092cc20b2a6d4460c55986623b50
发布于 2019-10-01 15:40:31
读十六进制的差异
当我在十六进制编辑器程序(例如,.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个字符。
请注意,它们是相同的十六进制。
重写十六进制
下面是我需要编辑的行(从我的十六进制编辑器) 0000018068693332改为: 0000000068693332
您有一半的解决方案-只是字符串替换和重写到文件。请记住,虽然Python的regex库回复在这里更强大,但它也不是必要的,因为您只需要进行字符串替换。而字符串替换是更快的数量级,而不是使用regex。
但是,如果您确实需要使用regex,则有很多方法可以实现编辑十六进制。
# 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
https://stackoverflow.com/questions/58177420
复制相似问题