代码之家  ›  专栏  ›  技术社区  ›  Allyn

十六进制转义问题

  •  2
  • Allyn  · 技术社区  · 15 年前

    我需要使用Ruby将转义字符打印到二进制文件中。主要的问题是斜杠需要整个字节正确转义,我不知道/不能这样创建字节。

    我创建的十六进制值基本上是:

    '\x' + char
    

    其中char是一些“hex”值,例如65。十六进制中,X65是ASCII字符“e”。

    不幸的是,当我把这个序列放到文件中时,最终得到的结果是:

    \\x65
    

    如何使用正确转义的值创建十六进制字符串?我试过了 许多 包括单引号或双引号、打包、解包、多个斜线等。我尝试过许多不同的组合,我觉得我现在比刚开始时更不了解这个问题。

    怎么用?

    3 回复  |  直到 15 年前
        1
  •  2
  •   rampion    15 年前

    好的,如果你想创建一个第一个字节的字符串 具有整数值 0x65 使用 Array#pack

    irb> [0x65].pack('U')
    #=> "e"
    irb> "e"[0]
    #=> 101
    

    一百零一 = 65 十六 所以这是可行的。

    如果要创建第一个字节为'\'的文本字符串, 第二个是“x”,第三个是“6”,第四个是“5”,然后使用插值:

    irb> "\\x#{65}"
    #=> "\\x65"
    irb> "\\x65".split('')
    #=> ["\\", "x", "6", "5"]
    
        2
  •  4
  •   Sarah Mei    15 年前

    您可能需要在文件上设置二进制模式,和/或使用putc。

    File.open("foo.tmp", "w") do |f|
      f.set_encoding(Encoding::BINARY) # set_encoding is Ruby 1.9  
      f.binmode                        # only useful on Windows
      f.putc "e".hex
    end
    

    希望这能给你一些想法,即使你有Ruby<1.9。

        3
  •  1
  •   Brian Campbell Dennis Williamson    15 年前

    如果您有十六进制值,并且希望创建一个包含与该十六进制值对应的字符的字符串,则可以执行以下操作:

    irb(main):002:0> '65'.hex.chr
    => "e"
    

    另一个选择是使用 Array#pack ;如果需要将数字列表转换为单个字符串,则可以使用此选项:

    irb(main):003:0> ['65'.hex].pack("C")
    => "e"
    irb(main):004:0> ['66', '6f', '6f'].map {|x| x.hex}.pack("C*")
    => "foo"