# Generate legitimate PNG with ImageMagick
convert -size 300x400 gradient:yellow-red orig.png
# Check its size
ls -l orig.png
-rw-r r 1 mark staff 2509 3 May 17:47 orig.png
# Check it with `pngcheck` - exit status = 0, i.e. all ok
File: orig.png (2509 bytes)
chunk IHDR at offset 0x0000c, length 13
300 x 400 image, 48-bit RGB, non-interlaced
chunk gAMA at offset 0x00025, length 4: 0.45455
chunk cHRM at offset 0x00035, length 32
White x = 0.3127 y = 0.329, Red x = 0.64 y = 0.33
Green x = 0.3 y = 0.6, Blue x = 0.15 y = 0.06
chunk bKGD at offset 0x00061, length 6
red = 0xffff, green = 0xffff, blue = 0xffff
chunk IDAT at offset 0x00073, length 2276
zlib: deflated, 32K window, maximum compression
chunk tEXt at offset 0x00963, length 37, keyword: date:create
chunk tEXt at offset 0x00994, length 37, keyword: date:modify
chunk IEND at offset 0x009c5, length 0
No errors detected in orig.png (8 chunks, 99.7% compression).
现在在末尾添加一些垃圾:
ls -l >> orig.png
# Check the size again
ls -l orig.png
-rw-r r 1 mark staff 8398 3 May 17:53 orig.png
# And check again - exit status =2
pngcheck -v orig.png
File: orig.png (8398 bytes)
chunk IHDR at offset 0x0000c, length 13
300 x 400 image, 48-bit RGB, non-interlaced
chunk gAMA at offset 0x00025, length 4: 0.45455
chunk cHRM at offset 0x00035, length 32
White x = 0.3127 y = 0.329, Red x = 0.64 y = 0.33
Green x = 0.3 y = 0.6, Blue x = 0.15 y = 0.06
chunk bKGD at offset 0x00061, length 6
red = 0xffff, green = 0xffff, blue = 0xffff
chunk IDAT at offset 0x00073, length 2276
zlib: deflated, 32K window, maximum compression
chunk tEXt at offset 0x00963, length 37, keyword: date:create
chunk tEXt at offset 0x00994, length 37, keyword: date:modify
chunk IEND at offset 0x009c5, length 0
additional data after IEND chunk
ERRORS DETECTED in orig.png
PNG以“IEND”块结尾。最后12个字节看起来总是一样的。因此,您可以使用:
上面的代码比在macos上工作所需的时间稍长,macos处理
grep -b
的方式与GNUGREP不同其要点是:
appended.png
的开头提取计数字节MATCH
grep -b
和cut
获取匹配的偏移量注意:如果不是不可能的话,12字节IEND块不太可能出现在PNG中,但是上面没有检查它
那是一个有趣的运动-谢谢
您可以运行
pngcheck -v YOURFILE.png
,它会告诉您末尾是否有额外的字节,并以错误状态退出2
它还将告诉您文件的实际结束位置:
现在在末尾添加一些垃圾:
它还告诉您文件的实际结尾在第三行到最后一行的位置,即0x009c5。您需要在上面添加8,以考虑IEND本身的大小
顺便说一句,如果在macOS上,您可以使用自制安装
pngcheck
,方法是:相关问题 更多 >
编程相关推荐