如何在Ruby中将包含整数数组的字符串写入文件并转换为字节?

4

我应该如何将二进制字符串数组表示原始写入文件?

#str is a String not an Array
str = "[80, 75, 3, 4, 10, 0, 0, 0, 0, 0, -74, 121, 57, 64, 0, 0, 0, 0]"

File.open('/Users/file.zip', "wb") do |file|
   file.write(str)
end

上面的代码无法正常工作。我该如何修复它?

我猜这就是你在寻找的:https://dev59.com/fnNA5IYBdhLWcg3wfN6O(pack/unpack方法)。 - Jef
5个回答

7

这里大多数答案都假设您使用的是数组,而不是您所述的字符串(正如您的示例所显示的那样)。以下内容适用于您在示例中展示的字符串:

File.open('/Users/file.zip', "wb") { |f| f.write(JSON.parse(str).pack('C*')) }

请确保要require 'json'


如果字符串包含一些危险代码,例如 system('rm -rf /'),那么使用 JSON.parse(str) 而不是 eval(str) 会更安全,因为这是一个有效的数组 JSON 表示形式。 - Simon Perepelitsa
非常感谢!请使用JSON.parse(str)更新主要答案以拯救生命... - CelinHC

0

你确定要吗?

str = "[80, 75, 3, 4, 10, 0, 0, 0, 0, 0, -74, 121, 57, 64, 0, 0, 0, 0]"

而不是

str = [80, 75, 3, 4, 10, 0, 0, 0, 0, 0, -74, 121, 57, 64, 0, 0, 0, 0]

关于写作:#write 调用 #to_s 将数组转换为其字符串表示,这不是您想要的。要控制该转换,请使用 Array#pack。尝试使用 file.write(str.pack('C*'))

str是一个字符串,所以如果我这样做,就会得到NoMethodError(undefined method `pack' for #String:0x007f833ce472f0): - CelinHC

0
它可以运行,但我认为它太不简洁了。
str = "[80, 75, 3, 4, 10, 0, 0, 0, 0, 0, -74, 121, 57, 64, 0, 0, 0, 0]"
int_array = str.gsub('[', '').gsub(']', '').split(', ').collect{|i| i.to_i}
File.open('/Users/file.zip', "wb") do |file|
   file.write(int_array.pack('C*'))
end

0

我想知道为什么没有人提到字符串转义。这样可以实现:

str = "\x50\x4B\x03\x04\x0A\0\0\0\0\0\xB6\x79\x39\x40\0\0\0\0"    
File.open('file.zip', "wb") { |file| file.write(str) }

很遗憾,没有十进制转义,所以您必须将数字转换为十六进制或八进制。


0

Array#packString#unpack 可以将数据转换为二进制字符串并进行反向操作。使用 IO#writeIO#read 处理这些字符串。


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