Ruby:如何将字符串转换为二进制并将其写入文件?

5
数据是一个UTF-8字符串:
data = 'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'

我尝试了各种不同的解包方法,但是在File.open("data.bz2", "wb").write(data.unpack('a*'))中没有取得成功。我只能获得文件中的字符串而不是字符串中的UTF-8编码的二进制数据。

3个回答

12
data = "BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08"

File.open("data.bz2", "wb") do |f|
  f.write(data)
end
write 接受一个字符串作为参数,而你已经有了一个字符串,不需要先解包。你可以使用 Array#pack 将例如数字的数组转换为二进制字符串,然后将其写入文件。如果你已经有了一个字符串,则不需要打包。当从文件(或其他位置)读取时,使用 unpack 将这种二进制字符串转换回数组。

还要注意,当没有块并且没有像 File.open(arguments).some_method 那样保存文件对象时,使用 File.open 会泄漏文件句柄。


我需要文件中的二进制值而不是字符串。这段代码与我的代码完全相同。 - Gerhard
你似乎认为包含字符串“\x01\x02”的文件与包含字节1后跟字节2的文件不同。但事实并非如此。如果你只是将字符串写入文件,它会按照你想要的方式执行。 - sepp2k

4

尝试使用双引号:

data = "BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03"

那么就按照sepp2k的建议去做吧。

1
啊,我完全忽略了他的字符串是用单引号括起来的。+1 - sepp2k
谢谢。当我读到sepp2k的评论时,我自己解决了它。魔鬼就在细节中。 - Gerhard

1

对于从互联网来到这里的人,以下是更通用的答案:

data = "BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03"

# write to file
File.write("path/to/file", data, mode: "wb") # wb: write binary

# read from file
File.read("path/to/file", mode: "rb") == data # rb: read binary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接