У меня есть следующий массив, который представляет десятичные значения символов ASCII и не ASCII.
a=[32, 57, 50, 32, 56, 51, 32, 65, 52, 130, 0, 101, 131, 69, 72, 38, 146, 89, 9]
Преобразование в символ выглядит следующим образом
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
Как я могу это сделать?
Спасибоза любую помощь.
ОБНОВЛЕНИЕ
При тестировании с большим массивом, как показано ниже, я вижу, что вывод верен только для решения @ rewritten.Выходные данные для этих новых массивов: "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"
Спасибо всем за помощь.