Из любопытства, как именно двоичный код преобразуется в буквы? Я знаю, что есть сайты, которые автоматически конвертируют двоичные слова в слова для вас, но я хочу понять конкретные промежуточные шаги, которые выполняет двоичный код, прежде чем преобразовать их в буквы.
Как именно двоичный код преобразуется в буквы?
Ответ 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
Вы имеете в виду преобразование 011001100110111101101111
→ foo
, например? Вы просто берете двоичный поток, разбиваете его на отдельные байты (01100110
, 01101111
, 01101111
) и смотрите ASCII, который соответствует заданному числу. Например, 01100110
равно 102 в десятичном значении, а символ ASCII с кодом 102 равен f
:
$ perl -E 'say 0b01100110'
102
$ perl -E 'say chr(102)'
f
(Посмотрите, что делает функция chr
.) Вы можете обобщить этот алгоритм и разное количество бит на символ и разные кодировки, точка остается той же.
Ответ 4
http://www.roubaixinteractive.com/PlayGround/Binary_Conversion/The_Characters.asp он просто выглядит здесь... (не ЗДЕСЬ, но у него есть таблица).
В байте 8 бит. Один байт может быть одним символом. Один бит либо включен, либо выключен.
Ответ 5
Почему бы просто не сделать это, 010010001001001 разделил его на два бита по 8 букв (01001000, 01001001). Затем выполните полномочия
01001000. 01001001.
Первые 8 игнорируют первые три, которые они определяют, являются ли они капитальными или нет, идут справа налево, выполняя полномочия 2 (2 ^ 1, 2 ^ 2 2 ^ 3 2 ^ 4 2 ^ 5). Итак, добавьте все, вверху, только один, и это = 8, а восемь букв в алфавите - h, поэтому наш первый бит - это буква h, попробуйте его на другом бите