кодиране на 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