2010-12-11 56 views

回答

2

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

你可能要做的一件事就是查看字符串的长度。即使对于小图像,大多数图像格式都至少为500-600字节,虽然这绝不是一个准确的测试,但如果通过了,例如20k的字符串,它可能是一个图像。如果是文字,它会相当多(类似于典型小说的四分之一左右)

+0

我同意你和我选择的第一选择,我想也许它更简单。非常感谢你。 – ywenbo 2010-12-11 07:24:26

1

像图像或声音文件这样的文件已经定义了可被“嗅探”的块。 Wotsit.org有很多关于关键字节和确定文件的方法。通过查看数据中的这些字节偏移量,您可以找出它。

另一种方式是使用一些“魔术”,它是代码来嗅探文件中的键字节或字节类型以试图找出它的类型。 * nix系统通过file命令内置它。做一个man fileman magic欲了解更多信息,或查看维基百科有关Magic numbers in files的文章。

Ruby Filemagic使用相同的技术,但基于GNU的libmagic。

+0

似乎这些链接并不适合我的意图。我的上下文是有一个ruby方法,它接受一个参数字符串,也许它是一个文字字符串,也许它是一个图像blob字符串,所以我需要根据字符串的不同内容做不同的操作。事实上,如果在红宝石中有Blob类型,我认为也许这将解决我的问题,但我找不到它。 – ywenbo 2010-12-11 04:27:47

0

什么构成一个字符串?你期待简单的ASCII码吗? UTF-8?或者用其他方式编码文本?

如果你知道你会得到ASCII文本或blob,那么你可以旋转第一个n字节,看看是否有任何东西有八位设置,这会告诉你,你有二进制。 OTOH,没有发现任何东西并不能保证你有文字。

如果你要获得UTF-8 Unicode,那么你会做同样的事情,但寻找无效的UTF-8序列。当然,同样的注意事项也适用。

您可以扫描第一个n字节的0x00和0x20之间的任何内容。如果你发现任何字节低,那么你可能有一些二进制的blob。但也许不是。

正如Tyler Eaves所说:字节是字节。你从一堆字节开始,试图找到对它们有意义的解释。

最好的办法是让来电者提供预期的解释,或者采取格雷格的建议并使用神奇的号码库。

+0

非常感谢,最后我添加了一个更多的参数来区分。无论如何非常感谢你。 – ywenbo 2010-12-11 07:25:36

相关问题