一个关于C程序的问题,求助高手
可否给出大概的实现代码?
谢谢回答的各位,但是分只能给一个人,希望大家理解! 展开
因为记事本是文字处理程序,只能显示可见的字符,而jpg文件是二进制文件,里面有很多数值是不可见字符。所以用记事本打开jpg文件就会造成这些不可见字符的丢失,最终导致jpg文件被损坏。
可以用C程序按照二进制方式打开jpg文件,然后在文件尾添加数据后保存。这样的操作会造成jpg文件不能被图片浏览软件识别,但是只要再通过程序把尾部添加的数据删除,则图片文件就可以恢复为原来的大小,并且也可以被图形软件识别了。
--------------------
如果想识别图片尾部是否有附加的文字信息,比较简单的办法,就是在附加的文字信息之前增加若干字节的特征码,比如连续2位或多位的0xff值,这是方法之一。同时也可以辅以附加文字信息定长的方式,如每次附加4K字节文字内容,之前用两个“|”字符作为标识符。
那么在判断的时候,可以从文件尾部倒数4K字节,然后取前两个字节判断是否为两个“|”,如果是,说明这个文件是附加过文字信息的。
----------------
按照jpeg文件格式规范,jpeg文件最后以0xFFD9结束,找到这两个字节,如果之后还有数据,必定是被附加上去的。
貌似这个问题有点难哦,首先你加入信息过后,文件的末尾就变了,文件内容也变了。如果你用c判断,它只知道这两个就是文件,那么你就需要去研究一下jpg的编码格式了,看其实以什么结尾的,在结尾后面加入自己的信息,再去找这个结尾的后面是否有东西就可以了,不过我感觉这个很难实现。
如果所说的两幅图片的原始图片是同一幅的话,直接编写程序进行二进制比较就可以找出差异,找出的差异部分可以通过识别是否为字符(文字信息)来判断哪幅图片被加入了文字信息;
如果所说的两幅图片不是同一幅,那么可能只有通过写一个字符识别程序一个一个图片去检验了,如果在某幅图片中检测到字符串,很大程度上就能说明问题了——jpg格式的图片是二进制数据,符合一定的编码规律,因此其中包含字符(尤其是有意义的字符)的概率很小,那么将其识别出来也不是难事吧。
另:
1. 这样的加密形式似乎很不靠谱啊,可以考虑数字水印什么的。
2. Beyond Compare: 文件比较工具,可以批量比较。
===========================修正补充==========================
修正:上述的二进制数据包含字符串可能性小的说法不对。事实上会有大量没有意义的字符出现在以记事本打开的jpg文件中...
查看jpeg中是否有隐含的文字信息(人为的),可以考虑从两方面入手:
1. 假设加入文字信息的是低手,随便用二进制或者文本编辑工具向jpg图片中塞进文字信息,那么最有可能的结果就是文件格式被破坏,这时应该很容易检测问题所在:jpeg文件包含压缩的数据信息和这些压缩数据的描述信息,两者是相互对应,密不可分,而其中的描述信息部分有有着严格的格式规范,因此按图索骥能大概确定问题的所在。前提是要熟悉jpeg文件的格式。
2. 假设加入文字信息的是高手,熟悉jpeg相关的知识,他可以利用jpeg文件结构的特点向文件加入一些表面不影响jpeg使用的数据,从而达到隐藏信息(或者其他)的目的。但破解这点对于一个熟悉jpeg的人应该也不难:加入冗余信息后的文件很大程度是不紧凑的,举例来说,通过增加一个多余的DHT表段(Huffman映射表)来承载插入的信息,那么这个行为几乎肯定能被检测到,就像生活拮据时我们总能砍掉不必要的开支。毕竟jpeg的出现就是为了尽量压缩图片的大小呀!存在那么高程度冗余信息的图片不是显得很另类吗?
以上只是大体分析了一下,具体实现可能会有麻烦,暂且保留意见。
综上所述,解决LZ的问题需要熟悉jpeg图片格式、编码标准等等。问题总不会太难办。
http://fengmm521.blog.163.com/blog/static/250913582008112584122401/
2010-10-29
http://hi.baidu.com/monyer/blog/item/8bad4d4a24141e2e08f7ef29.html