我需要使用Ruby将转义字符打印到二进制文件。主要问题是斜杠需要整个字节正确转义,我不知道/不能以这种方式创建字节。
我正在创建十六进制值,基本上是:
'\x' + char
其中char是某个'十六进制'值,例如65.在十六进制中,\ x65是ASCII字符'e'。
不幸的是,当我把这个序列放到文件中时,我最终得到了这个:
\\x65
如何使用正确转义的值创建十六进制字符串?我尝试了一些 很多 的东西,涉及单引号或双引号,打包,解包,多个斜杠等。我尝试了很多不同的组合,我觉得好像我我现在开始做的时候就更少了解问题了。
如何?
答案 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"