首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby: IO的二进制字符串

Ruby: IO的二进制字符串
EN

Stack Overflow用户
提问于 2013-07-14 03:02:23
回答 2查看 3.8K关注 0票数 6

我有一个二进制数据字符串,我需要它作为IO对象。所以我试了一下:

代码语言:javascript
运行
复制
r, w = IO.pipe()
w << data

但它失败了,并显示以下错误:

代码语言:javascript
运行
复制
Encoding::UndefinedConversionError ("\xD0" from ASCII-8BIT to UTF-8)

为什么它首先要尝试转换为UTF-8?有没有办法将IO::pipe方法强制转换为二进制模式?

更多详细信息:

我正在尝试使用Mongoid驱动程序从MongoDB读取二进制数据(这是一个Excel文件),然后将其转换为IO对象,以便使用电子表格gem读取它。Spreadsheet#open需要文件路径或IO对象。

下面是我的文件文档的外观:

代码语言:javascript
运行
复制
class ImportedFile
    include Mongoid::Document

    field :file_name, type: String
    field :binary_content, type: Moped::BSON::Binary
end

下面是我最初保存二进制数据的方式:

代码语言:javascript
运行
复制
imported_file = ImportedFile.new
imported_file.file_name = uploaded_file.original_filename
imported_file.binary_content = Moped::BSON::Binary.new(:generic, uploaded_file.read)
imported_file.save

下面是我尝试阅读它的方式(不起作用):

代码语言:javascript
运行
复制
imported_file = ImportedFile.find(file_id)

r, w = IO.pipe()
w << imported_file.binary_content.data
book = Spreadsheet.open r
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-14 03:14:42

您可以使用StringIO来实现这一点:

代码语言:javascript
运行
复制
require 'stringio'

io = StringIO.new(binary_data)
book = Spreadsheet.open(io)
票数 5
EN

Stack Overflow用户

发布于 2017-02-27 01:32:25

请勿对二进制数据使用raw StringIO。我发现没有人在现实世界中测试过StringIO

代码语言:javascript
运行
复制
bin = ["d9a1a2"].pack("H*")
puts bin.encoding
puts bin[0].unpack("H*")
puts "----"

io = StringIO.new bin
puts io.string.encoding
puts io.string[0].unpack("H*")
puts "----"

io = StringIO.new
io << bin
puts io.string.encoding
puts io.string[0].unpack("H*")
io.string.force_encoding Encoding::BINARY
puts io.string.encoding
puts io.string[0].unpack("H*")
puts "----"

io = StringIO.new
io.binmode
io << bin
puts io.string.encoding
puts io.string[0].unpack("H*")
io.string.force_encoding Encoding::BINARY
puts io.string.encoding
puts io.string[0].unpack("H*")
puts "----"

io = StringIO.new
io.set_encoding Encoding::BINARY
io << bin
puts io.string.encoding
puts io.string[0].unpack("H*")
puts "----"

ruby-2.3.3

代码语言:javascript
运行
复制
ASCII-8BIT
d9
----
ASCII-8BIT
d9
----
UTF-8
d9a1
ASCII-8BIT
d9
----
ASCII-8BIT
d9
ASCII-8BIT
d9
----
ASCII-8BIT
d9
----

rbx-3.72

代码语言:javascript
运行
复制
ASCII-8BIT
d9
----
ASCII-8BIT
d9
----
UTF-8
d9a1
ASCII-8BIT
d9
----
UTF-8
d9a1
ASCII-8BIT
d9
----
ASCII-8BIT
d9
----

jruby-9.1.7.0

代码语言:javascript
运行
复制
ASCII-8BIT
d9
----
ASCII-8BIT
d9
----
UTF-8
d9a1
ASCII-8BIT
d9
----
UTF-8
d9a1
ASCII-8BIT
d9
----
ASCII-8BIT
d9
----

  1. 永远不使用原始StringIO
  2. 不信任binmode。它不是核磁共振专用的存根。
  3. 使用io.set_encoding Encoding::BINARYio.set_encoding Encoding::BINARY
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17633293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档