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

问题描述 投票:0回答:4

数据是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 编码的二进制数据。

ruby utf-8
4个回答
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
且未像
File.open(arguments).some_method
那样保存文件对象时,您会泄漏文件句柄。


4
投票

尝试使用双引号:

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

然后按照 sepp2k 的建议进行操作。


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

0
投票

应该也可以:

data = "BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03"
    
# write to file
File.binwrite("path/to/file", data)
    
# read from file
File.binread("path/to/file") == data
© www.soinside.com 2019 - 2024. All rights reserved.