2016-01-27 5 views
1

У меня есть строка целых чисел "72101108108111", но это строка, представляющая байты исходной строки "Hello".Преобразование строки целых чисел в байтовый массив в Ruby

Как можно преобразовать «72101108108111» в строку Ascii «Hello» в Ruby?

+1

Вы не можете. Невозможно определить, является ли первый байт '7' или' 72'. Если мы правильно догадаемся '72', то нельзя сказать, является ли второй байт' 1', '10' или' 101' и т. Д. Однако эта строка была сгенерирована, она не генерировалась с учетом декодирования. –

+0

Можем ли мы это сделать, если предположить, что 2 цифры составляют байт? т.е. 72,10,11 и т. д.? – user3075906

+0

Это не даст вам «Привет». Код ASCII для 'H' равен 72, но' e' равен 101. –

ответ

0

Отвечая на Ваш вопрос разъяснен в комментарии (который не имеет ничего общего с названием):

мне нужно кодировать/декодировать строку в Base58

EDIT: теперь как класс (с использованием драгоценного камня base58):

require 'base58' 

class Base58ForStrings 
    def self.encode(str) 
    Base58.encode(str.bytes.inject { |a, b| a * 256 + b }) 
    end 

    def self.decode(b58) 
    b = [] 
    d = Base58.decode(b58) 
    while (d > 0) 
     d, m = d.divmod(256) 
     b.unshift(m) 
    end 
    b.pack('C*').force_encoding('UTF-8') 
    end 
end 

Base58ForStrings.encode('Hello こんにちは') 
# => "5scGDXBpe3Vq7szFXzFcxHYovbD9c" 
Base58ForStrings.decode('5scGDXBpe3Vq7szFXzFcxHYovbD9c') 
# => "Hello こんにちは" 

Работы для любой строки UTF-8.

+0

Спасибо за помощь. И как мне получить «Hello» из «9aJCVZR»? Декодирование даст мне целое число. – user3075906

0
s = '72101108108111' 
pattern=/^[a-zA-Z]/ 
index,res=0,'' 
while index<s.size 
    len=0 
    while (s[index..index+len].to_i.chr=~pattern).nil? 
    len+=1 
    end 
    res << s[index..index+len].to_i.chr 
    index+=len+1 
end 

p res 

Попробуйте это, потому что длина каждой строки, подлежащей расшифровке, не является достоверной.

Например, "72->'H' , 101->'e' , 23->'\x17'"

Таким образом, каждый раз, когда мы находим символ декодируется не "a~z" or "A~Z" (ex:\x17),

мы просто добавим длину и разобрать, пока мы не найдем символ, который мы хотим

Для этого случая, то ответ будет правильным "Hello"

Возможно, он неисправен в некоторых случаях, но теперь он хорошо работает для моего теста

Просто возьмите его взгляд

Он работает только без исключений на случай, содержащий только "A-Z и A-Z"

+0

Это эксклюзивный случай, в котором содержится только английский персонаж, помните об этом! – DumDumGenius

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