我有一个字符串
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
但不起作用。
答案 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
根据您的要求。