图片完整性校验的思路

2016.07.29 21:34 Fri| 531 visits 问题&解决方案| Text

图片不完整?

最近写了一个可以把Bing首页的每日图片设置成极路由背景的插件,但是会出现一个问题,图片可能只下载了一半,影响美观。

该怎么样check呢?

思路一:

最容易想到的,用MD5或者hash校验,Plan A;

  • 优点:是检验准确,而且在个编程语言都很好实现。
  • 缺点:需要服务器提供相应的api,实现成本较大。
思路二:

今天早上偶然想到的,先来个链接JPG的wiki,英文对付着看,要点是EOI(End of image),看懂了吗?所有标准的jpg都要以EOI结尾,也就是0xFF,0xD9(和字节序有关,不同平台读出顺序可能不一样)。怎么样是不是豁然开朗?

嗯就是他,只要读取图片文件的最后两个Byte,看看是不是EOI就万事大吉了。但是这里还有个漏洞,前提条件就是图片不是分割开下载的,也就是你程序download图片一定要是单线程,从最开头下载才可以。如果你仔细看完了全文,自然知道这种方法的优缺点了。

  • 优点:只需在本地判断,无需服务器提供其他信息。
  • 缺点:如果下载图片是分块下载那么判定可能会失效;很多编程语言二进制方式读取文件比较难实现。

This is Plan B

Talk is cheap,show me your code

Shell的实现方式

    while [[ "$(hexdump -s $((`ls -l $Pic_path | awk '{print $5}'`-2)) $Pic_path | awk 'NR==1{print $2}')" != "d9ff" ]] ; 
    do
        curl -kso $Pic_path $Pic_URL  
    done

something

每一次要实现什么功能,心里总会先想到一个笨拙但肯定可行的Plan A,但这时我不会动手立马去做;也许是望着窗外发呆时的灵光乍现,还是看着躺在床上难以入眠的冥思苦想,直到脑海浮现出一个全新的、创造性的、省力的Plan B,我才会心满意足的敲起代码。所以大家都说“懒惰”是程序猿最好的品质,如是而已。而思维才是武装自己最好的武器。