кодирование строки ruby ​​1.8.7

Я пытаюсь реализовать следующий код C++ в Ruby:

sprintf (tmp, "|%02x", Payload[i] & 0xFF);

По сути, все байты в данных полезной нагрузки, значение которых не является кодом букв или цифр в кодовой таблице US-ASCII, кодируются как три байта:

| X1 X2

где '|' это байт со значением кода символа '|' в таблице кодов US-ASCII (0x7C) «X1» — первая шестнадцатеричная цифра кода байта, а «X2» — вторая шестнадцатеричная цифра кода байта.

До сих пор я закодировал это:

payload.each_char do |char|
  if char.match(/^[[:alnum:]]$/) 
    encoded_string << char && next 
  end
  encoded_string << sprintf("|%02x", char.hex);  
end

Проблема в том, что это не работает правильно для специальных символов, таких как «*» и других.

Любые идеи высоко ценятся.


person Emil Petkov    schedule 18.12.2012    source источник
comment
Что происходит с такими символами, как *?   -  person Esailija    schedule 18.12.2012
comment
Ruby 1.8 не поддерживает кодировки, поэтому вы не можете использовать char.hex, так как тип символа может хранить только символы US-ASCII.   -  person Linuxios    schedule 18.12.2012
comment
Хорошо, я знаю, что Ruby 1.8 не поддерживает кодировки. Как тогда реализовать то же поведение, что и код C++ выше?   -  person Emil Petkov    schedule 18.12.2012


Ответы (1)


У меня нет 1.8.7 для тестирования, но это работало в 1.9.3, и все используемые методы должны быть в 1.8.7:

payload.each_byte do |byte|
  if byte.chr.match(/^[[:alnum:]]$/) 
    encoded_string << byte.chr && next 
  end
  encoded_string << sprintf("|%02x", byte);  
end

Результат с "hello world***":

hello|20world|2a|2a|2a
person Esailija    schedule 18.12.2012
comment
Забавно, я реализовал ТО ЖЕ ЖЕ код, он работал, но пока я нахожу время вставить его сюда (разговаривая с коллегой), вы его вставили. Потрясающий! - person Emil Petkov; 18.12.2012