从表示Ruby中十六进制字节的文本字符串写入二进制文件

时间:2019-01-06 06:33:37

标签: ruby binaryfiles

我有以下文本字符串,表示应在文件中显示的十六进制字节。

str = "001104059419632801001B237100300381010A"

当我使用十六进制编辑器打开创建的文件时,我想创建一个包含上述字符串的文件,我看到相同的字节数

当我运行此脚本时

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

它创建文件out.dat,当我在十六进制编辑器中打开该文件时包含该文件

5B2233303330333133313330333433303335333933343331333933363333333233383330333133303330333134323332333333373331333033303333333033303333333833313330333133303431225D

并且我希望在Hex编辑器中打开文件时的内容与文本字符串相同

 001104059419632801001B237100300381010A

我该怎么做?

我希望有道理。谢谢

1 个答案:

答案 0 :(得分:1)

首先必须将字符串按对齐的字节分隔。

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