数据是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 编码的二进制数据。
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
那样保存文件对象时,您会泄漏文件句柄。
尝试使用双引号:
data = "BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03"
然后按照 sepp2k 的建议进行操作。
对于从互联网来到这里的人们来说更通用的答案:
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
应该也可以:
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