在ruby中如何检查字符串是一个实际字符串还是blob数据如图像,从数据类型来看它们是ruby字符串,但实际上它们的内容非常不同,因为一个是文字字符串,另一个是blob数据,如图像。
有人能为我提供一些线索吗?提前谢谢。
答案 0 :(得分:2)
字节是字节。没有办法声明某些东西不是文件数据。构造一个只有可打印ASCII的多种格式的有效文件相当容易。特别是在处理Unicode时,你处于非常模糊的领域。如果可能的话,我建议修改方法,这样它需要两个参数...一个用于传递文本,另一个用于二进制数据。
您可能要做的一件事就是查看字符串的长度。对于一个微小的图像,大多数图像格式至少为500-600字节,虽然这绝不是一个准确的测试,如果你通过,比如一个20k的字符串,它可能是一个图像。如果它是文本,那将是相当多的(像典型小说的四分之一,或其左右)
答案 1 :(得分:1)
图像或声音文件等文件已经定义了可以“嗅探”的块。 Wotsit.org有很多关于关键字节的信息以及确定文件内容的方法。通过查看数据中的那些字节偏移量,您可以找到它。
另一种方法是使用一些“魔术”,这是用于在文件中嗅探键字节或字节类型的代码,以试图弄清楚它的类型是什么。 * nix系统通过file
命令内置它。请查看man file
或man magic
以获取更多信息,或查看维基百科关于Magic numbers in files的文章。
Ruby Filemagic使用相同的技术但基于GNU的libmagic。
答案 2 :(得分:0)
什么构成一个字符串?你期待简单的ASCII吗? UTF-8?或者用其他方式编码文本?
如果您知道要获取ASCII文本或blob,那么您可以旋转第一个n
字节并查看是否有任何八位设置,这会告诉您有二进制文件。 OTOH,没有找到任何东西,不能保证你有文字。
如果你要获得UTF-8 Unicode,那么你会做同样的事情,但寻找无效的UTF-8序列。当然,同样的警告也适用。
您可以扫描第一个n
字节,查找0x00和0x20之间的任何内容。如果您发现任何低字节,那么您可能有某种二进制blob。但也许不是。
正如Tyler Eaves所说:字节是字节。你从一堆字节开始,并试图找到有意义的解释。
最好的办法是让来电者提供预期的解释,或者接受Greg的建议,并使用魔数库。