2015-11-03 3 views
0

Мне нужно преобразовать большую двоичную строку (последовательность байтов) в ASCII, такую ​​как table. Я также могу начать с шестнадцатеричной строки.Преобразование двоичного (или шестнадцатеричного) в ASCII

Я прочитал это сообщение: Converting binary data to string in ruby. Я нашел решение, которое преобразуется в символы в расширенной таблице ASCII. Я мог писать условные обозначения для каждого случая, чтобы преобразовать, но должен быть более простой способ. Может кто-нибудь помочь?

ответ

2

Ссылка, указанная содержит коды, в который выполняет преобразование, на странице, не затемненные:

function OnConvert() 
    { 
     hex = document.calcform.hex.value; 
     hex = hex.match(/[0-9A-Fa-f]{2}/g); 
     len = hex.length; 
     if(len==0) return; 
     txt=''; 
     for(i=0; i<len; i++) 
     { 
      h = hex[i]; 
      code = parseInt(h,16); 
      t = String.fromCharCode(code); 
      txt += t; 
     } 
     document.calcform.txt.value = txt; 
    } 

Я не понимаю вашу задачу ясно, так как если вы будете ввести е. г. EEEFFA там в форме, вы получите îïú как выход, что, на мой взгляд, расширено ASCII. Но есть простой способ достичь той же функции в рубине.

▶ "EEEFFA".scan(/[0-9a-f]{2}/i).map { |cp| cp.to_i(16) }.inject('', &:concat) 
#⇒ "îïú" 

UPD Как я понял из комментариев, вы хотите преобразовать каждые 8 ​​нулей и единиц на соответствующий ASCII буквы. Здесь вы идете (если у вас есть длинная строка, содержащие нули и единицы):

▶ '010000010100001001000011'. 
▷ scan(/[01]{8}/).   # allow only zeros and ones, scan by 8 
▷ map { |e| e.to_i 2 }.  # convert to integers, base 10 
▷ inject '', &:concat  # concatenate into one string 
#⇒ 'ABC' 
+0

Я, вероятно, не должен был включать эту ссылку ... Я имею в виду, я хочу ввести что-то вроде «01000001» .some_functions_and_things и получить значение «A». Как вы думаете, вы могли бы мне помочь? Я не очень опытен, и я не понимаю, что происходит в вашем коде. Моя программа будет разрешать только байты 00000000 до 01111111 –

+1

'' 01000001 ".to_i (2) .chr' – mudasobwa

+0

Отлично! Спасибо, что написано для меня. –

1

небольшое изменение на отличном решении @ mudasobwa, используя в (по-видимому, нелегальную) особенность String#oct:

'010000010100001001000011' 
    .scan(/0[01]{7}/) 
    .map { |b| b.prepend('0b').oct.chr } 
    .join 

И шестигранный, для полноты:

'627e29397c5727611147503e36355a4f683737' 
    .scan(/[0-7]\h/) 
    .map { |x| x.prepend('0x').oct.chr } 
    .join 

Я открыл доклад bug на рубинового-лана, если кто-то заинтересован ...

Смежные вопросы