【问题标题】:Convert string to hexadecimal in Ruby在Ruby中将字符串转换为十六进制
【发布时间】:2012-01-11 02:51:20
【问题描述】:

我正在尝试使用 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"

提前致谢。

【问题讨论】:

    标签: ruby binary hex


    【解决方案1】:

    Binary to hex conversion in four languages(包括 Ruby)可能会有所帮助。

    该页面上的一个 cmets 似乎提供了一个非常简单的捷径。该示例涵盖从STDIN 读取输入,但任何字符串表示都应该这样做。:

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

    【讨论】:

      【解决方案2】:

      改变这一行:

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

      到这里:

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

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

      【讨论】:

        【解决方案3】:

        我不知道这是否是最好的解决方案,但这是一个解决方案:

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

        【讨论】:

        • 你不需要.self,尽管我知道有些人还是喜欢拥有它。
        【解决方案4】:

        Ruby 1.9 添加了一种更简单的方法来做到这一点: "0x101".hex 将返回字符串中以十六进制形式给出的数字。

        【讨论】:

        • 这完全相反 '0xff'.hex => 255 它将十六进制转换为十进制。
        • @noraj:这句话很不清楚,你说得对——我已经编辑过了。
        【解决方案5】:

        有关另一种方法,请查看unpack

        【讨论】:

        • 那个链接现在失效了
        • 谢谢,我把它改成了标准文档。一个简单的谷歌搜索“ruby unpack”将找到其他几个描述。
        猜你喜欢
        • 2021-12-26
        • 1970-01-01
        • 2018-01-31
        • 2010-09-10
        • 2018-01-22
        • 1970-01-01
        • 2013-02-07
        • 2022-07-22
        • 1970-01-01
        相关资源
        最近更新 更多