Ruby: each_byte 方法

Ruby: each_byte method

我需要对给定的字符串使用 each_byte 方法并正确格式化它。

我正在使用的字符串存储在变量 the_string 中,并包含以下字符(空格和数字是字符串的一部分):

1.               this string has leading space and too    "MANY tabs and sPaCes betweenX"

我正在寻找的输出,如果格式正确,应该如下所示:

----------
C|Dec|Hex
----------
1| 49|0x31
.| 46|0x2E
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
 | 32|0x20
t|116|0x74
h|104|0x68
i|105|0x69
s|115|0x73
 | 32|0x20
s|115|0x73
t|116|0x74
r|114|0x72
i|105|0x69
n|110|0x6E
g|103|0x67
 | 32|0x20

然而,当我使用

puts the_string.each_byte {|c| print c, ' ' }

我得到的结果如下所示:

49 46 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 116 104 105 115 32 115 116 114 105 110 103 32 104 97 115 32 108 101 97 100 105 110 103 32 115 112 97 99 101 32 97 110 100 32 116 111 111 32 32 32 32 34 77 65 78 89 32 116 97 98 115 32 97 110 100 32 115 80 97 67 101 115 32 98 101 116 119 101

如何格式化我的结果,以便它以如上所示的列格式打印原始字符、十进制值和十六进制值?我查看了文档,但无法找到有关如何使用 each_byte 的详细信息。感谢您的帮助!

您在这里有多种选择,对于十六进制,您可以使用 sprintf 或旧的 to_s 并指定基数为 16 进制,这是一个示例:

a = "YOUR STRING WHICH IS WAY TOO LONG TO FORMAT PROPERLY ON Whosebug"

# Output is:
# chr | ord | hex

# using sprintf
a.each_byte do |byte|
    puts [byte.chr, byte.to_s, ("0x%02X" % byte)].join("\t")
end

# using to_s(16) which will use base-16 
a.each_byte do |byte|
    puts [byte.chr, byte.to_s, "0x#{byte.to_s(16).upcase}"].join("\t")
end

旁注:注意多字节字符。