起因, 目的:
就是想看看 jpg 里面有什么。
其实,我最开始的想法是,自己来写一个文件格式,只能我自己才能打开。
然后看了 jpg 相关的内容,发现太复杂,只能罢了。
1. jpg 的魔法头数字(File Magic Numbers : ff d8 ff e0
验证一下是不是 jpg
def main(filename):
print(f"filename: {filename}")
with open(filename, 'rb') as file:
first_4_bytes = file.read(4)
print(first_4_bytes)
magic_numbers = first_4_bytes.hex()
print(f"magic numbers: {magic_numbers}")
return magic_numbers
if __name__ == "__main__":
main("bt1.jpg")
# 输出
# filename: bt1.jpg
# b'\xff\xd8\xff\xe0'
# magic numbers: ffd8ffe0
2. 搞点小动作。
- 先在一个 jpg 文件的文件头部, 添加一些字节,产生一个新的文件,X?
- 这个 X 就会产生 : Windows照片查看器无法显示此图片
- 然后从文件头删除这些添加的字节, 把 X 还原为 jpg.
def modify_jpg(input_file, output_file):
"""
在JPG文件的文件头添加指定的字节
:param input_file: 输入文件的路径
:param output_file: 输出文件的路径
:param bytes_to_add: 要添加的字节
"""
bytes_to_add = b'\x01\x02\x03\x04'
with open(input_file, 'rb') as f:
file_content = f.read()
# 在文件头添加字节
modified_content = bytes_to_add + file_content
with open(output_file, 'wb') as f:
f.write(modified_content)
print(f"File '{output_file}' has been created with the added bytes.")
def restore_jpg(modified_file, original_file):
"""
从修改后的JPG文件头删除之前添加的字节,还原JPG文件
:param modified_file: 被修改的文件路径
:param original_file: 要写入还原后文件的路径
"""
with open(modified_file, 'rb') as f:
file_content = f.read()
# 检查文件内容是否以添加的字节开始
if file_content.startswith(b'\x01\x02\x03\x04'):
# 删除文件头的字节
restored_content = file_content[4:]
else:
print("The file does not start with the expected bytes.")
return
with open(original_file, 'wb') as f:
f.write(restored_content)
print(f"File '{original_file}' has been restored.")
# 使用示例
input_path = 'bt1.jpg' # 原始JPG文件路径
modified_path = 'modified.jpg' # 修改后的文件路径
restored_path = 'restored.jpg' # 还原后的文件路径
# 第一步:修改JPG文件
modify_jpg(input_path, modified_path)
# 第二步:还原JPG文件
restore_jpg(modified_path, restored_path)
结论 + todo
有时候,一时的想法, 不知从何而起,以为很简单,其实很费劲。