【问题标题】:Escape problem with hex十六进制转义问题
【发布时间】:2009-04-08 02:41:00
【问题描述】:

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

我正在创建十六进制值,基本上:

'\x' + char

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

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

\\x65

如何创建具有正确转义值的十六进制字符串?我尝试了 很多 的东西,包括单引号或双引号、打包、解包、多个斜杠等。我尝试了很多不同的组合,我觉得我现在对问题的理解比我刚开始时要少。

怎么做?

【问题讨论】:

    标签: ruby escaping hex


    【解决方案1】:

    您可能需要在文件上设置二进制模式,和/或使用 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

    【讨论】:

      【解决方案2】:

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

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

      10110 = 6516,所以这行得通。

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

      irb> "\\x#{65}"
      #=> "\\x65"
      irb> "\\x65".split('')
      #=> ["\\", "x", "6", "5"]
      

      【讨论】:

        【解决方案3】:

        如果您有十六进制值,并且想要创建一个包含与该十六进制值对应的字符的字符串,您可以这样做:

        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"
        

        【讨论】:

        • 将字符串 \x65 打印到名为 foo.tmp 的文件中。我需要将二进制字节 \x65 打印到文件中。
        • 你看到我回答的后半部分了吗? '65'.hex.chr 会将字符串 '65' 转换为数字 101(0x65),然后将其转换为字符“e”,您可以将其写出来。我还将在我的答案中添加另一个使用 Array#pack 的示例。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-27
        • 2011-12-25
        • 2014-01-22
        • 2015-05-22
        • 2014-04-20
        • 1970-01-01
        相关资源
        最近更新 更多