有没有办法检查Ruby变量是否包含二进制数据?

Dav*_*ave 10 ruby binary encoding ruby-on-rails ms-office

我正在使用Ruby 2.4和Rails 5.我有一个名为"content"的变量文件内容.内容可能包含来自PDF文件,Word文件或HTML文件等内容的数据.有没有办法判断变量是否包含二进制数据?最后,我想知道这是PDf,Microsoft Office还是其他类型的OpenOffice文件.这个答案 - Rails:可以检查一个字符串是否是二进制文件? - 建议我可以检查变量的编码

content.encoding
Run Code Online (Sandbox Code Playgroud)

它会产生

ASCII-8BIT
Run Code Online (Sandbox Code Playgroud)

但是,在二进制数据的情况下,我注意到存在变量中存储的HTML内容也可能返回"ASCII-8BIT"作为content.encoding,因此使用"content.encoding"并不是一种万无一失的方法.告诉我我是否有二进制数据.这种方式是否存在,如果存在,它是什么?

Bor*_*aMa 3

如果您真正的问题不是关于二进制数据本身,而是关于确定数据的文件类型,我建议您查看ruby​​-filemagic gem,它将为您提供更可靠的信息。gem 是 libmagic 库的简单包装器,它是类 unix 系统上的标准。该库的工作原理是扫描文件内容并将其与各种文件类型中的一组已知“魔术”模式进行匹配。

字符串缓冲区的示例用法(例如从数据库读取的数据):

require "ruby-filemagic"

content = File.read("/.../sample.pdf") # just an example to get some data

fm = FileMagic.new
fm.buffer(content)    
#=> "PDF document, version 1.4"
Run Code Online (Sandbox Code Playgroud)

为了让 gem 工作(并编译),您需要该file实用程序以及magic系统上安装的带有标头的库。引用自述文件:

需要 file(1) 库和标头:

Debian/Ubuntu:: +libmagic-dev+
Fedora/SuSE:: +file-devel+
Gentoo:: +sys-libs/libmagic+
OS X::brew install libmagic

经测试在 Rails 5 下运行良好。