2009-10-21 4 views
2

данных является UTF-8 строка:Ruby: Как преобразовать строку в двоичную и записать его в файл

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

Попробуйте использовать двойные кавычки:

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

Тогда сделайте, как sepp2k предложил.

+0

Ahrg, я полностью упустил тот факт, что его строка была одинарной. +1 – sepp2k

+0

Спасибо. Я решил это сам, когда прочитал комментарий от sepp2k. Дьявол кроется в деталях. – Gerhard

7
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, такого как File.open(arguments).some_method, вы пропускаете дескриптор файла.

+0

Мне нужны двоичные значения в файле, а не строка. Этот код точно такой же, как и мой код. – Gerhard

+0

Кажется, что файл, содержащий строку «\ x01 \ x02», отличается от файла, содержащего байта 1, за которым следует байт 2. Это не тот случай. Если вы просто напишете строку в файл, она будет делать то, что вы хотите. – sepp2k

Смежные вопросы