Как именно двоичный код преобразуется в буквы?
из любопытства, как именно двоичный код преобразуется в буквы? Я знаю, что есть сайты, которые автоматически преобразуют двоичный код в слова для вас, но я хочу понять конкретные промежуточные шаги, которые двоичный код проходит, прежде чем быть преобразованным в буквы.
6 ответов
предполагая, что под" двоичным кодом "вы подразумеваете просто старые данные (последовательности битов или байтов), а под" буквами " вы подразумеваете символы, ответ состоит из двух шагов. Но сначала кое-что.
- символ - это просто именованный символ, такой как" Латинская заглавная буква A "или" греческая маленькая буква PI "или"черный шахматный рыцарь". Не путайте символ (абстрактный символ) с символ (изображение персонажа).
- A набор символов is определенный набор символов, каждый из которых связан со специальным номером, называется его кодовой точкой. Чтобы просмотреть сопоставления точек кода в наборе символов Юникода, см. http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.
хорошо, теперь вот два шага:
данные, если они текстовые, должны каким-то образом сопровождаться кодировка, что-то вроде UTF-8, Latin-1, US-ASCII и т. д. Каждый символ схема кодирования подробно определяет, как байтовые последовательности интерпретируются как кодовые точки (и наоборот, как кодовые точки кодируются как байтовые последовательности).
Как только последовательности байтов интерпретируются как кодовые точки, у вас есть свои символы, потому что каждый символ имеет определенную кодовую точку.
пара замечаний:
- в некоторых кодировках определенные последовательности байтов не соответствуют никаким кодовым точкам вообще, поэтому вы можете иметь символ ошибки декодирования.
- в некоторых наборах символов есть неиспользуемые кодовые точки, то есть они вообще не соответствуют символу.
другими словами, не каждая последовательность байтов означает что-то как текст.
вот способ преобразования двоичных чисел в символы 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 других способов в течение нескольких минут. Подробности зависят от языковой среды компьютера.)
вы имеете в виду преобразование 011001100110111101101111
→ foo
, например? Вы просто берете двоичный поток, разделяете его на отдельные байты (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 = Ж.