Как преобразовать 5-битную двоичную строку в буквенный символ? - PullRequest
3 голосов
/ 20 февраля 2011

Если у меня есть 5-битная двоичная строка, такая как '01010', как я могу преобразовать ее в соответствующий алфавитный символ?

('00000' -> 'a' .. '11111' -> 'F')

Я делаю это для сжатия большого набора логических значений в строку, которая может толькосодержат буквенные символы [a-zA-Z].

Ответы [ 3 ]

3 голосов
/ 20 февраля 2011

Версия для универсальной кодировки

s = '00001'
code = s.to_i(2)
puts (?a.ord + code).chr  # => b
3 голосов
/ 20 февраля 2011
letters = ('a'..'z').to_a + ('A'..'F').to_a
letters["00000".to_i(2)] # => 'a'
letters["11111".to_i(2)] # => 'F'
letters["01010".to_i(2)] # => 'k'
0 голосов
/ 21 февраля 2011

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

class SomeClass
    @@letters = (('a'..'z').to_a+('A'..'F').to_a)
    def self.decode str
        str.chars.map do |c|
            c = @@letters.index(c).to_s(2)
            while c.length < 5
                c = "0#{c}"
            end
            c
        end.join('').split('').map do |c|
            if c == '1'
                true
            else
                false
            end
        end
    end
    def self.encode *bools
        str = ''
        until bools.length == 0
            five = ''
            5.times do
                five += bools.length > 0 ? (bools.shift() ? '1' : '0') : '0'
            end
            str += @@letters[five.to_i(2)]
        end
        str
    end
end

Это нормально, что я дополняю массив логических значений дополнительными логическими значениями, потому чтов моей программе я точно знаю, сколько у меня логических значений, чтобы я мог обрезать декодированный массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...