如何检查ruby字符串是一个实际的字符串或blob数据,如图像

时间:2010-12-11 04:08:21

标签: ruby string blob

在ruby中如何检查字符串是一个实际字符串还是blob数据如图像,从数据类型来看它们是ruby字符串,但实际上它们的内容非常不同,因为一个是文字字符串,另一个是blob数据,如图像。

有人能为我提供一些线索吗?提前谢谢。

3 个答案:

答案 0 :(得分:2)

字节是字节。没有办法声明某些东西不是文件数据。构造一个只有可打印ASCII的多种格式的有效文件相当容易。特别是在处理Unicode时,你处于非常模糊的领域。如果可能的话,我建议修改方法,这样它需要两个参数...一个用于传递文本,另一个用于二进制数据。

您可能要做的一件事就是查看字符串的长度。对于一个微小的图像,大多数图像格式至少为500-600字节,虽然这绝不是一个准确的测试,如果你通过,比如一个20k的字符串,它可能是一个图像。如果它是文本,那将是相当多的(像典型小说的四分之一,或其左右)

答案 1 :(得分:1)

图像或声音文件等文件已经定义了可以“嗅探”的块。 Wotsit.org有很多关于关键字节的信息以及确定文件内容的方法。通过查看数据中的那些字节偏移量,您可以找到它。

另一种方法是使用一些“魔术”,这是用于在文件中嗅探键字节或字节类型的代码,以试图弄清楚它的类型是什么。 * nix系统通过file命令内置它。请查看man fileman 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的建议,并使用魔数库。