在Ruby中将字符串转换为十六进制

7

我正在尝试使用Ruby将二进制文件转换为十六进制。

目前我有以下内容:

File.open(out_name, 'w') do |f|
  f.puts "const unsigned int modFileSize = #{data.length};"
  f.puts "const char modFile[] = {"
  first_line = true
  data.bytes.each_slice(15) do |a|
    line = a.map { |b| ",#{b}" }.join
    if first_line
      f.puts line[1..-1]
    else
      f.puts line
    end
    first_line = false
  end
  f.puts "};"
end

这是以下代码生成的内容:
const unsigned int modFileSize = 82946;
const char modFile[] = {
 116, 114, 97, 98, 97, 108, 97, 115, 104, 0, 0, 0, 0, 0, 0
, 0, 0, 0, 0, 0, 62, 62, 62, 110, 117, 107, 101, 32, 111, 102
, 32, 97, 110, 97, 114, 99, 104, 121, 60, 60, 60, 8, 8, 130, 0
};

我需要的是以下内容:
const unsigned int modFileSize = 82946;
const char modFile[] = {
 0x74, 0x72, etc, etc
};

我需要将一个字符串转换为它的十六进制值。

"116" => "0x74",等等。

提前致谢。

5个回答

26

Ruby 1.9添加了更简单的方法来实现这一点: "0x101".hex将返回字符串中给定十六进制数。


1
这段代码实现了相反的功能:'0xff'.hex => 255,它将十六进制转换为十进制。 - noraj
@noraj:这句话非常不清楚,你说得对——我已经编辑过了。 - Linuxios

9

将这一行改为:

line = a.map { |b| ", #{b}" }.join

转换为:

line = a.map { |b| sprintf(", 0x%02X",b) }.join

(如果需要,将其更改为%02x。从示例中不清楚十六进制数字是否应大写。)

8
我不确定这是否是最佳方案,但这是一个解决方案:
class String
  def to_hex
    "0x" + self.to_i.to_s(16)
  end
end

"116".to_hex
   => "0x74" 

你不需要使用.self,尽管我知道有些人仍然喜欢使用它。 - Cary Swoveland

5

For another approach, check out unpack


那个链接现在已经失效了。 - Jason Axelson
1
谢谢,我已将其更改为标准文档。简单的谷歌搜索“ruby unpack”将会找到其他几个描述。 - DGM

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接