Как мне написать строку, содержащую массив целых чисел в файл в виде байтов в Ruby? - PullRequest
4 голосов
/ 25 января 2012

Как записать (необработанное) представление массива двоичных строк в файл?

#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

Код выше не работает. Как я могу это исправить?

Ответы [ 5 ]

7 голосов
/ 25 января 2012

Большинство ответов здесь предполагают, что вы используете массив, а не строку, как вы указали (и как показывает ваш пример). Это должно работать со строкой, которую вы показали в примере:

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

Просто убедитесь, что require 'json'.

0 голосов
/ 03 мая 2014

Интересно, почему никто не упомянул о побегах строк?Это работает:

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 голосов
/ 25 января 2012

Вы уверены, что хотите

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*')).

0 голосов
/ 25 января 2012

Это работает, но я думал, что это было слишком грязно

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 голосов
/ 25 января 2012

Array#pack и String#unpack конвертируются в двоичные строки и обратно. Используйте IO#write и IO#read для этих строк.

...