Подтвердить что ты не робот

Как именно двоичный код преобразуется в буквы?

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

4b9b3361

Ответ 1

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

  • Символ - это просто именованный символ, например "ЛАТИНСКАЯ СТОЛИЧНАЯ ПИСЬМА А" или "ГРЕЧЕСКАЯ МАЛЕНЬКАЯ ПИСЬМА" или "ЧЕРНЫЙ ШАХМАТНЫЙ НОЧЬ". Не путайте символ (абстрактный символ) с глифом (изображение персонажа).
  • Набор символов - это определенный набор символов, каждый из которых связан со специальным числом, называемым его кодовым числом. Чтобы увидеть сопоставления кодовых точек в наборе символов Юникода, см. http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.

Итак, вот два шага:

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

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

Несколько примечаний:

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

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

Ответ 2

Здесь вы можете преобразовать двоичные числа в символы 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], например десятичные или "base 10", каждая цифра вместо этого может представлять 16 разных чисел [0 - f].)

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

Например,

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

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

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

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

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

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

7340298b392 = 07 34 02 98 b3 92

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

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

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

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

Например, b3 hex = 11 * 16 + 3, что равно 110 + 66 + 3, что составляет 179. (b hex равно 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 или больше, а число букв алфавита, связанного с этим набором 2 шестнадцатеричных цифры.


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

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

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

Например

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

(При этом полезно помнить, что "m" (или "M" ) является 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. 7a - наибольшее шестнадцатеричное число для буквы. Все, что больше 7a, не является буквой.


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

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

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

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

Ответ 3

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

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

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

Ответ 5

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

01001000. 01001001.

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