首页 > 解决方案 > 从表示 Ruby 中十六进制字节的文本字符串写入二进制文件

问题描述

我有以下文本字符串,它表示应该出现在要创建的文件中的十六进制字节。

str = "001104059419632801001B237100300381010A"

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

当我运行这个脚本

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

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

5B2233303330333133313330333433303335333933343331333933363333333233383330333133303330333134323332333333373331333033303333333033303333333833313330333133303431225D

我希望在十六进制编辑器中打开文件时的内容与文本字符串相同

 001104059419632801001B237100300381010A

我怎样才能做到这一点?

我希望有意义。谢谢

标签: rubybinaryfiles

解决方案


您必须首先按对齐的字节拆分字符串。

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

现在您可以使用 eg 将其转储到文件中IO#binwrite


推荐阅读