我正在尝试使用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"
等
提前致谢。
答案 0 :(得分:21)
Ruby 1.9添加了一种更简单的方法:
"0x101".hex
将字符串中的数字作为十六进制数字返回。
答案 1 :(得分:8)
更改此行:
line = a.map { |b| ", #{b}" }.join
到此:
line = a.map { |b| sprintf(", 0x%02X",b) }.join
(如果需要,更改为%02x
,从示例中不清楚十六进制数字是否应该大写。)
答案 2 :(得分:6)
我不知道这是否是最佳解决方案,但这是一个解决方案:
class String
def to_hex
"0x" + self.to_i.to_s(16)
end
end
"116".to_hex
=> "0x74"
答案 3 :(得分:4)
Binary to hex conversion in four languages(包括Ruby)可能会有所帮助。
该页面上的一条评论似乎提供了一个非常简单的捷径。该示例涵盖了从STDIN
读取输入,但任何字符串表示都应该执行。:
STDIN.read.to_i(base=16).to_s(base=2)
答案 4 :(得分:4)
有关其他方法,请查看unpack