2

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

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

'\x' + char

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

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

\\x65

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

如何?

4

3 回答 3

4

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

于 2009-04-08T18:58:17.600 回答
2

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

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

101 10 = 65 16,所以这行得通。

如果要创建一个文字字符串,其第一个字节是'\',第二个是'x',第三个是'6',第四个是'5',那么只需使用插值:

irb> "\\x#{65}"
#=> "\\x65"
irb> "\\x65".split('')
#=> ["\\", "x", "6", "5"]
于 2009-04-08T19:21:44.530 回答
1

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

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"
于 2009-04-08T02:55:14.480 回答