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

Из любопытства, как именно двоичный код преобразуется в буквы? Я знаю, что есть сайты, которые автоматически конвертируют двоичный код в слова для вас, но я хочу понять конкретные промежуточные этапы, через которые проходит двоичный код, прежде чем конвертировать в буквы.

Ответы [ 6 ]

20 голосов
/ 22 августа 2015

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

1 - конвертировать каждые 4 двоичных цифры в одну шестнадцатеричную цифру.

Вот диаграмма преобразования двоичного числа в шестнадцатеричное:

0001 = 1 
0010 = 2 
0011 = 3 
0100 = 4 
0101 = 5
0110 = 6
0111 = 7
1000 = 8

1001 = 9
1010 = a (the hex number a, not the letter a)
1011 = b
1100 = c
1101 = d
1110 = e
1111 = f

(Шестнадцатеричные числа от a до f - это десятичные числа от 10 до 15. Вот что такое шестнадцатеричное или «основание 16» - вместо каждогоцифра способна представлять 10 различных чисел [0 - 9], как десятичное число или «основание 10», каждая цифра вместо этого способна представлять 16 различных чисел [0 - f].)

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

Например,

01000100 = 0100 0100 = 44 hex
1010001001110011 = 1010 0010 0111 0011 = a273 hex

Достаточно просто, верно?Простое преобразование двоичного числа любой длины в его шестнадцатеричный эквивалент.

(Это работает, потому что шестнадцатеричное - это основание 16, а двоичное - это основание 2, а 16 - это четвертая степень 2, поэтому требуется 4двоичные цифры, чтобы сделать 1 шестнадцатеричное число. 10, с другой стороны, не является степенью 2, поэтому мы не можем преобразовать двоичные числа в десятичные почти так же легко.)

2 - Разделить строкушестнадцатеричных цифр в пары.

При преобразовании числа в ASCII каждые две шестнадцатеричные цифры являются символом.Итак, разбейте шестнадцатеричную строку на наборы из 2 цифр.

Вы бы разбили шестнадцатеричное число, например 7340298b392, на 6 пар, например:

7340298b392 = 07 34 02 98 b3 92

(Обратите внимание, что перед 0 стоитУ меня было нечетное количество шестнадцатеричных цифр.)

Это 6 пар шестнадцатеричных цифр, так что это будет 6 букв.(За исключением того, что я сразу знаю, что 98, b3 и 92 не являются буквами. Я объясню почему через минуту.)

3 - преобразовать каждую пару шестнадцатеричных цифр в десятичное число.

Сделайте это путем умножения (десятичного эквивалента) левой цифры на 16 и добавления 2-й.

Например, b3 hex = 11 * 16 + 3, что равно 110+ 66 + 3, что равно 179. (b шестнадцатеричное число 11 десятичное.)

4 - преобразование десятичных чисел в символы ASCII.

Теперь, чтобы получитьБуквы ASCII для десятичных чисел, просто имейте в виду, что в ASCII 65 - это прописная буква «A», а 97 - строчная буква «a».

Итак, что такое буква 68?

68 - это 4-я буква алфавита в верхнем регистре, верно?
65 = A, 66 = B, 67 = C, 68 = D.

Итак, 68 - «D».

Вы берете десятичное число, вычитаете 64 для заглавных букв, если число меньше 97, или 96 для строчных букв, если число 97 или больше, и это номер буквы алфавита.t связан с этим набором из 2 шестнадцатеричных цифр.


В качестве альтернативы, если вы не боитесь небольшого количества простой шестнадцатеричной арифметики, вы можете пропустить шаг 3 и просто перейти прямо от шестнадцатеричного к ASCII, помня, например, что

hex 41 = 'A' 
hex 61 = 'a'

Так что вычтите 40 шестнадцатеричных для заглавных букв или 60 шестнадцатеричных для строчных букв, и преобразуйте то, что осталось в десятичную, чтобы получить номер буквы алфавита.

Например,

01101100 = 6c, 6c - 60 = c = 12 decimal = 'l'
01010010 = 52, 52 - 40 = 12 hex = 18 decimal = 'R'

(При этом полезно помнить, что «m» (или «M») - это 13 букв алфавита.Таким образом, вы можете считать от 13 до 13, чтобы найти букву ближе к середине, чем к любому концу.)

Я видел это однажды на рубашке и смог прочитать это в своей голове:

01000100
01000001
01000100

Я сделал это так:

01000100 = 0100 0100 = 44 hex, - 40 hex = ucase letter 4 = D
01000001 = 0100 0001 = 41 hex, - 40 hex = ucase letter 1 = A
01000100 = 0100 0100 = 44 hex, - 40 hex = ucase letter 4 = D

Рубашка с надписью "DAD", что, как мне показалось, было круто, поскольку ее покупала беременная женщина.Ее муж, должно быть, такой же выродок, как я.


Как я сразу понял, что 92, b3 и 98 - это не буквы?

Поскольку ASCII-код для строчной буквы 'z' равен 96 + 26 = 122, что в шестнадцатеричном виде равно 7a.7а - самое большое шестнадцатеричное число для буквы.Все, что больше 7a, не является буквой.


Так вот, как вы можете сделать это как человек.

Как это делают компьютерные программы?

Для каждогонабор из 8 двоичных цифр, преобразование его в число и поиск в таблице ASCII.

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

20 голосов
/ 26 июля 2011

Предполагая, что под "двоичным кодом" вы подразумеваете просто старые данные (последовательности битов или байтов), а под "буквами" вы подразумеваете символы, ответ состоит из двух шагов. Но сначала немного предыстории.

  • Символ - это просто именованный символ, такой как «LATIN CAPITAL LETTER A» или «GREEK SMALL LETTER PI» или «BLACK CHESS KNIGHT». Не путайте символ (абстрактный символ) с глифом (изображением символа).
  • A набор символов - это определенный набор символов, каждый из которых связан со специальным номером, называемым его кодовой точкой. Чтобы увидеть сопоставления кодовых точек в наборе символов Unicode, см. http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.

Хорошо, теперь вот два шага:

  1. Данные, если они текстовые, должны каким-либо образом сопровождаться кодировкой символов , что-то вроде UTF-8, Latin-1, US-ASCII и т. Д. Каждая схема кодировки символов определяет очень подробно, как байтовые последовательности интерпретируются как кодовые точки (и наоборот, как кодовые точки кодируются как байтовые последовательности).

  2. Как только последовательности байтов интерпретируются как кодовые точки, у вас есть ваши символы, потому что каждый символ имеет определенную кодовую точку.

Пара замечаний:

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

Другими словами, не каждая последовательность байтов означает что-то как текст.

7 голосов
/ 26 июля 2011

Вы имеете в виду, например, конверсию 011001100110111101101111foo? Вы просто берете двоичный поток, разделяете его на отдельные байты (01100110, 01101111, 01101111) и ищите символ ASCII , который соответствует данному числу. Например, 01100110 - это 102 в десятичном виде, а символ ASCII с кодом 102 - f:

$ perl -E 'say 0b01100110'
102
$ perl -E 'say chr(102)'
f

( Посмотрите, что делает функция chr .) Вы можете обобщить этот алгоритм и иметь различное количество битов на символ и разные кодировки, точка остается той же.

1 голос
/ 27 сентября 2018

Чтобы читать двоичные символы ASCII с большой скоростью, используя только вашу голову:

Буквы начинаются с начальных битов 01. Бит 3 включен (1) для строчных букв, выключен (0) для прописных букв. Отсканируйте следующие биты 4–8 для первого включенного и выберите начальную букву из того же индекса в этой строке: «PHDBA» (подумайте P.H.D., Bachelors in Arts). Например. 1xxxx = P, 01xxx = H и т. Д. Затем преобразуйте оставшиеся биты в целочисленное значение (например, 010 = 2) и посчитайте это количество букв до начального. Например. 01001010 => H + 2 = J.

0 голосов
/ 30 марта 2015

Почему бы просто не сделать это, возьмите 010010001001001 и разделите его на два бита по 8 букв каждый (01001000, 01001001). Тогда выдайте полномочия

01001000. 01001001.

Первые 8 игнорируют первые три, которые они определяют, если это столица или нет, иди направо налево, делая полномочия 2 (2 ^ 1, 2 ^ 2 2 ^ 3 2 ^ 4 2 ^ 5). Итак, сложите все, есть только один, и он = 8, и восемь букв в алфавите h, поэтому наш первый бит - буква h, попробуйте другой бит

0 голосов
/ 26 июля 2011

http://www.roubaixinteractive.com/PlayGround/Binary_Conversion/The_Characters.asp это просто выглядит здесь ... (не ЗДЕСЬ, но у него есть таблица).

В байте 8 бит.Один байт может быть одним символом.Один бит включен или выключен.

...