十六进制逃脱问题

时间:2009-04-08 02:41:01

标签: ruby escaping hex

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

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

'\x' + char

其中char是某个'十六进制'值,例如65.在十六进制中,\ x65是ASCII字符'e'。

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

\\x65

如何使用正确转义的值创建十六进制字符串?我尝试了一些 很多 的东西,涉及单引号或双引号,打包,解包,多个斜杠等。我尝试了很多不同的组合,我觉得好像我我现在开始做的时候就更少了解问题了。

如何?

3 个答案:

答案 0 :(得分: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。

,这也可以给你一些想法

答案 1 :(得分: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"]

答案 2 :(得分: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"
相关问题