从Ruby中的数组仅获取十六进制值(字节)

时间:2019-01-17 08:29:37

标签: ruby byte chr

我有以下数组,它们表示ASCII和非ASCII字符的十进制值。

a=[32, 57, 50, 32, 56, 51, 32, 65, 52, 130, 0, 101, 131, 69, 72, 38, 146, 89, 9]

转换为char看起来像这样

a.map{|b| b.chr}
=> [" ", "9", "2", " ", "8", "3", " ", "A", "4", "\x82", "\x00", "e", "\x83", "E", "H", "&", "\x92", "Y", "\t"]

然后加入以创建一个带有字节(成对的十六进制数字,[0-9A-F]的字符串)的字符串:

a.map{|b| b.chr}.join
=> " 92 83 A4\x82\x00e\x83EH&\x92Y\t"

然后我要从第一个非ASCII值\ x82删除字符串,我确实喜欢这样,但是什么也没发生。

a.map{|b| b.chr}.join.gsub(/\\x.*/,"")
=> " 92 83 A4\x82\x00e\x83EH&\x92Y\t"

我的预期输出是下面只有十六进制数:

92 83 A4

我该怎么做?

感谢您的帮助。

更新

用一个更大的数组(如下面的数组)进行测试,我看到输出仅对于@rewrite的解决方案是正确的。此新数组的输出为“ 92 83 49 26 92 59 00”

a=[32, 57, 50, 32, 56, 51, 32, 52, 57, 32, 50, 54, 32, 57, 50, 32, 53, 57, 
32, 48, 48, 0, 0, 0, 0, 2, 130, 0, 0, 8, 254, 70, 124, 0, 6, 0, 3, 0, 3, 
27, 0,2, 27, 3, 0, 227, 7, 1, 14, 17, 33, 0, 28, 14, 47, 38, 146, 89, 9]

a.map(&:chr).join.match(/^( \X\X)+/)[0]            # rewritten's solution
a.map(&:chr).take_while(&"\x80".method(:>)).join   # Aleksei's solution
a.map(&:chr).take_while(&:ascii_only?).join        # cremno's solution

irb(main): a.map(&:chr).join.match(/^( \X\X)+/)[0]
=> " 92 83 49 26 92 59 00"

irb(main): a.map(&:chr).take_while(&"\x80".method(:>)).join
=> " 92 83 49 26 92 59 00\x00\x00\x00\x00\x02"

irb(main): a.map(&:chr).take_while(&:ascii_only?).join
=> " 92 83 49 26 92 59 00\x00\x00\x00\x00\x02"

感谢大家的帮助。

2 个答案:

答案 0 :(得分:3)

只需将其过滤 ,然后再将数组连接到字符串中即可

[" ", "9", "2", " ", "8", "3", " ", "A", "4", "\x82", "\x00"].
  take_while(&"\x80".method(:>))
#⇒ [" ", "9", "2", " ", "8", "3", " ", "A", "4"]

然后对结果数组做任何您想做的事情。

答案 1 :(得分:2)

鉴于此评论,我假设您真的想询问匹配模式“空格,十六进制,十六进制”,直到第一个不匹配为止。

这就像

a.map(&:chr).join.match(/^( \X\X)+/)[0]

它将特殊的\X占位符用于与u十六进制数字(0-9,A-F,a-f)匹配的u


其他信息:

再次根据我对问题的解释,如果原始数组很长(或一个流),则无需消耗所有内容。您最好尽快停止生成字符:

hexs = "0123456789ABCDEF".split.map(&:ord)
a.
  lazy.
  each_slice(3).
  take_while { |spc, h1, h2| spc == 32 && hexs.include?(h1) && hexs.include?(h2) }.
  flat_map(&:chr).
  to_a.
  join

这样,甚至不考虑整数数组的任何部分。