Записать двоичный файл из текстовой строки, которая представляет шестнадцатеричные байты в Ruby - PullRequest
0 голосов
/ 06 января 2019

У меня есть следующая текстовая строка, которая представляет шестнадцатеричные байты, которые должны появиться в файле для создания.

str = "001104059419632801001B237100300381010A"

Я хочу создать файл, который содержит вышеуказанную строку, чтобы при открытии созданного файла в шестнадцатеричном редакторе я видел те же байты

Когда я запускаю этот скрипт

File.open("out.dat", 'w') {|f| f.write(str.unpack('H*')) }

создает файл out.dat, и когда я открываю этот файл в шестнадцатеричном редакторе, он содержит

5B2233303330333133313330333433303335333933343331333933363333333233383330333133303330333134323332333333373331333033303333333033303333333833313330333133303431225D

и я хотел бы, чтобы содержимое при открытии файла в редакторе Hex было такой же текстовой строкой

 001104059419632801001B237100300381010A

Как я могу это сделать?

Надеюсь, есть смысл. Спасибо

1 Ответ

0 голосов
/ 06 января 2019

Вы должны разбить строку на выровненных байтов в первую очередь.

str.
  each_char.     # enumerator
  each_slice(2). # bytes
  map { |h, l| (h.to_i(16) * 16 + l.to_i(16)) }.
  pack('C*')

 #⇒ "\x00\x11\x04\x05\x94\x19c(\x01\x00\e#q\x000\x03\x81\x01\n"

или, еще лучше:

str.
  scan(/../).
  map { |b| b.to_i(16) }.
  pack('C*')

Теперь вы можете записать это в файл, используя, например, IO#binwrite.

...