【问题标题】:Rails: possible to check if a string is binary?Rails:可以检查字符串是否是二进制的?
【发布时间】:2011-11-29 03:24:52
【问题描述】:

在一个特定的 Rails 应用程序中,我将二进制数据从 LDAP 中提取到一个变量中进行处理。有没有办法检查变量是否包含二进制数据?如果它不是二进制的,我不想继续处理这个变量。我希望使用is_a?...

事实上,我从 LDAP 中提取的二进制数据是一张照片。那么也许有更好的方法来确保变量包含二进制 JPEG 数据?此检查的结果将决定是继续处理 JPEG 数据,还是改为从磁盘呈现默认 JPEG。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    这个问题实际上比你想象的要多得多。只有从 Ruby 1.9 开始,才有字符(在某些编码中)与原始字节的概念。因此,在 Ruby 1.9 中,您可能能够摆脱请求编码。由于您从 LDAP 获取内容,因此传入字符串的编码应该是众所周知的,很可能是 ISO-8859-1 或 UTF-8。

    在这种情况下,您可以获得编码并采取行动:

    some_variable.encoding # => when ASCII-8BIT, treat as a photo
    

    由于您确实想验证二进制数据是照片,因此通过图像库运行它是有意义的。想到了 RMagick。 documentation 将向您展示如何验证任何二进制数据实际上是 JPEG 编码的。然后,您还可以存储其他属性,例如宽度和高度。

    如果您没有安装 RMagick,另一种方法是将数据保存到 Tempfile 中,下拉到 Unix(假设您在 Unix 上)并尝试识别该文件。如果您的系统安装了 ImageMagick,identify 命令将告诉您有关图像的所有信息。但是只要调用 file 也会告诉你:

    ~/Pictures$ file P1020359.jpg 
    P1020359.jpg: JPEG image data, EXIF standard, comment: "AppleMark"
    

    您需要在shell from Ruby 中调用identifyfile 命令:

    %x(identify #{tempfile})
    %x(file #{tempfile})
    

    【讨论】:

    • 顺便说一句,如果JPEG数据被编码成Base64等字符串格式,直接从变量中获取编码是行不通的。
    • 很棒的解释。目前,我只是使用.encoding.name != 'ASCII-8BIT',在我决定稍后进行更详细说明之前,它可以正常工作。非常感谢您提供如此完整的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 2014-08-10
    • 2022-10-13
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多