如何在数组中添加单个反斜杠

时间:2018-07-09 13:47:32

标签: ruby hex backslash

我有一个字符串

a = "IN-EN00-456"

我需要将其转换为

形式的十六进制代码
"\x49\x4e\x2d\x45\x4e\x30\x30\x2d\x34\x35\x36"

有人可以帮我吗?我尝试过:

a.each_byte.map { |b| b.to_s(16)}.join("")
# => "494e2d454e30302d343536"

a.each_byte.map { |b| b.to_s(16)}.join("\x")
# >> SyntaxError: (irb):3: invalid hex escape

a.each_byte.map { |b| "\x" + b.to_s(16)}.join

但不起作用。

1 个答案:

答案 0 :(得分:1)

如果要在双引号引起来的字符串中包含反斜杠(因此),则必须使用另一个反斜杠对其进行转义。否则,ruby此时将尝试解决十六进制字面量,这是不可能的,因为它后面没有两个有效的十六进制字符(在使用时)。但是转义反斜杠的收益率

puts "\\x"
# => \x

或者,您可以使用单引号引起来的字符串文字。

puts '\x'
# => \x

还请注意,join将分隔符仅放在集合的单个成员之间,而不放在前面。按照我的理解,既然您希望\x在每个字节之前,您应该首先映射数组的所有元素,然后再加入空格。

应用于您自己的方法的实际上应该已经可以正常工作了:

a.each_byte.map {|b| '\x' + b.to_s(16) }.join

a.each_byte.map {|b| "\\x#{b.to_s(16)}" }.join

为我制作

# => "\\x49\\x4e\\x2d\\x45\\x4e\\x30\\x30\\x2d\\x34\\x35\\x36"

的内部表示形式
\x49\x4e\x2d\x45\x4e\x30\x30\x2d\x34\x35\x36

根据您的要求。