出于好奇,二进制代码究竟是如何转换成字母的?我知道有些网站会自动将二进制文件转换为单词,但我想了解二进制代码在转换为字母之前经过的具体中间步骤。
答案 0 :(得分:20)
假设“二进制代码”是指普通旧数据(比特或字节序列),而“字母”表示字符,答案分为两步。但首先是一些背景知识。
现在好了,这是两个步骤:
数据(如果是文本的话)必须以某种方式附加字符编码,类似于UTF-8,Latin-1,US-ASCII等。每个字符编码方案详细说明了如何将字节序列解释为代码点(相反,如何将代码点编码为字节序列)。
一旦字节序列被解释为代码点,就会有你的字符,因为每个字符都有一个特定的代码点。
一对夫妇注意到:
换句话说,并非每个字节序列都意味着文本。
答案 1 :(得分:19)
这是一种将二进制数转换为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的十进制数。这是十六进制的,或者是" base 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的幂,所以需要4个二进制数来制作1个十六进制数。另一方面,10不是2的幂,所以我们几乎不能轻易地将二进制转换为十进制。)
2 - 将十六进制数字串分成对。
将数字转换为ASCII时,每2个十六进制数字就是一个字符。因此,将十六进制字符串分成两组数字。
您可以将像这样的十六进制数字(如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十六进制为十进制小数。)
4 - 将十进制数转换为ASCII字符。
现在,要获得十进制数的ASCII字母,请记住,在ASCII中,65是大写' A',97是小写' a'。
那么68是什么字母?
68是大写字母的第四个字母,右边?
65 = A,66 = B,67 = C,68 = D。
所以68是D'
。你取十进制数,如果数字小于97,则减去64表示大写字母;如果数字是97或更大,则减去96表示小写字母,这是相关字母表的字母数使用那组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
衬衫说" DAD",我认为它有点酷,因为它是由一名孕妇购买的。她的丈夫一定是个像我一样的极客。
我怎么知道92,b3和98不是字母?
因为小写的ASCII代码' z'是96 + 26 = 122,十六进制是7a。 7a是字母的最大十六进制数。任何大于7a的东西都不是字母。
这就是你如何能够做到这一点。
计算机程序是如何做到的?
对于每组8个二进制数字,将其转换为数字,并在ASCII表中查找。
(这是一个非常明显和直接的方式。一个典型的程序员可能会在几分钟的时间内想到10或15种其他方式。细节取决于计算机语言环境。)
答案 2 :(得分:7)
您的意思是转化011001100110111101101111
→foo
吗?您只需获取二进制流,将其拆分为单独的字节(01100110
,01101111
,01101111
),然后查找与给定数字对应的ASCII字符。例如,01100110
十进制为102,代码为102的ASCII字符为f
:
$ perl -E 'say 0b01100110'
102
$ perl -E 'say chr(102)'
f
(See what the chr
function does。)你可以推广这个算法,每个字符和不同的编码有不同的位数,这一点保持不变。
答案 3 :(得分:1)
仅用头部即可快速读取二进制ASCII字符:
字母以第01位开头。小写的第3位为(1),大写的为off(0)。扫描以下第4–8位以找到第一个,并从该字符串的相同索引中选择起始字母:“ PHDBA”(请考虑文学博士学位,文学士)。例如。 1xxxx = P,01xxx = H,依此类推。然后将剩余的位转换为整数值(例如010 = 2),并从起始字母算起那么多的字母。例如。 01001010 => H + 2 = J。
答案 4 :(得分:0)
http://www.roubaixinteractive.com/PlayGround/Binary_Conversion/The_Characters.asp它只是看起来......(不是这里,但它有一张表)。
一个字节有8位。一个字节可以是一个符号。一位是打开或关闭。
答案 5 :(得分:0)
为什么不这样做010010001001001将其分成两位8个字母(01001000,01001001)。然后发出权力
01001000。 01001001.
前8个忽略前三个他们确定它是否为大写,从右到左做2的幂(2 ^ 1,2 ^ 2 2 ^ 3 2 ^ 4 2 ^ 5)。所以然后添加所有的,只有一个,它= 8,字母表中的八个字母是h所以我们的第一位是字母h,在另一位尝试它