2011-12-02 82 views
2

我試圖使用Ruby將二進制文件轉換爲十六進制。在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"

在此先感謝。

回答

7

改變這一行:如果有必要

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

(更改爲%02x

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

本,從這個例子中不清楚這個十六進制數字是否應該大寫。)

4

Binary to hex conversion in four languages(包括Ruby)可能會有幫助。

該頁面上的一條評論似乎提供了一個非常簡單的捷徑。這個例子涵蓋了從STDIN讀取輸入,但是任何字符串表示應該做的:

STDIN.read.to_i(base=16).to_s(base=2) 
6

我不知道這是不是最好的解決辦法,但這樣的解決方案:

class String 
    def to_hex 
    "0x" + self.to_i.to_s(16) 
    end 
end 

"116".to_hex 
    => "0x74" 
+0

你不需要'.self',雖然我認識一些喜歡有也無妨。 –

19

的Ruby 1.9增加了一個更簡單的方法來做到這一點: "0x101".hex將返回字符串中的數字爲十六進制數。

+0

這太棒了!謝謝 – mko

4

對於另一種方法,檢查出unpack

+0

該鏈接現已停止 –

+1

謝謝,我將其更改爲標準文檔。一個簡單的谷歌搜索「紅寶石解壓縮」會發現其他幾個描述。 – DGM

相關問題