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

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

6 ответов


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

  • символ - это просто именованный символ, такой как" Латинская заглавная буква A "или" греческая маленькая буква PI "или"черный шахматный рыцарь". Не путайте символ (абстрактный символ) с символ (изображение персонажа).
  • A набор символов is определенный набор символов, каждый из которых связан со специальным номером, называется его кодовой точкой. Чтобы просмотреть сопоставления точек кода в наборе символов Юникода, см. http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.

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

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

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

например,

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

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

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

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

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

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

7340298b392 = 07 34 02 98 b3 92

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

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

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

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

для например, Б3 Хекс = 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 = Д.

итак, 68-это "D".

вы берете десятичное число, вычитаете 64 для прописных букв, если число меньше 97, или 96 для строчных букв, если число 97 или больше, и это число буквы алфавита, связанного с этим набором из 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, Чтобы найти букву, которая ближе к середине, чем к любому концу.)

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

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

на рубашке было написано "Папа", что, по-моему, было круто, так как ее покупала беременная женщина. Ее муж должен быть придурком вроде меня.


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

потому что код ASCII для нижнего регистра " z " равен 96 + 26 = 122, что в hex равно 7a. 7a-наибольшее шестнадцатеричное число для буквы. Ничего больше 7а не письмо.


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

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

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

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


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

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

(посмотрим, что


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

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


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

01001000. 01001001.

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


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

буквы начинаются с ведущих бит 01. Бит 3 включен (1) для нижнего регистра, выключен (0) для заглавных букв. Сканируйте следующие биты 4-8 для первого, который включен, и выберите начальную букву из того же индекса в этой строке: "PHDBA" (думаю, P. H. D., бакалавры искусств). Например. 1xxxx = P, 01xxx = H и т. д. Затем преобразуйте оставшиеся биты в целочисленное значение (например, 010 = 2) и посчитайте, что много букв от вашего начальная буква. Е. Г. 01001010 => Х+2 = Ж.