Binary 二进制代码到底是如何转换成字母的?
出于好奇,二进制代码到底是如何转换成字母的?我知道有些网站可以自动将二进制代码转换为文字,但我想了解二进制代码在转换为字母之前所经过的具体中间步骤。这里看起来。。。(不在这里,但它有一张桌子)Binary 二进制代码到底是如何转换成字母的?,binary,Binary,出于好奇,二进制代码到底是如何转换成字母的?我知道有些网站可以自动将二进制代码转换为文字,但我想了解二进制代码在转换为字母之前所经过的具体中间步骤。这里看起来。。。(不在这里,但它有一张桌子) 一个字节有8位。一个字节可以是一个符号。一位为开或关。您的意思是转换0110011100110111101111→ foo?您只需获取二进制流,将其拆分为单独的字节(01100110,01101111,01101111),然后查找与给定数字对应的字符。例如,01100110是十进制的102,带有代码102
一个字节有8位。一个字节可以是一个符号。一位为开或关。您的意思是转换
0110011100110111101111
→ <例如,code>foo?您只需获取二进制流,将其拆分为单独的字节(01100110
,01101111
,01101111
),然后查找与给定数字对应的字符。例如,01100110
是十进制的102,带有代码102的ASCII字符是f
:
$ perl -E 'say 0b01100110'
102
$ perl -E 'say chr(102)'
f
(.)你可以推广这个算法,每个字符有不同的位数和不同的编码,这一点保持不变。假设“二进制代码”指的是普通的旧数据(位序列或字节),而“字母”指的是字符,答案分两步。但首先,一些背景
- 字符只是一个命名符号,如“拉丁大写字母A”或“希腊小写字母PI”或“黑棋骑士”。不要将字符(抽象符号)与字形(字符的图片)混淆
- 字符集是一组特定的字符,每个字符都与一个称为其代码点的特殊数字相关联。要查看Unicode字符集中的码点映射,请参阅
- 在某些编码中,某些字节序列根本不对应任何代码点,因此可能会出现字符解码错误
- 在某些字符集中,存在未使用的代码点,也就是说,它们根本不对应任何字符
换句话说,并不是每个字节序列都意味着文本。为什么不把010010001001001分成两个位,每个位8个字母(01001000,01001001)。然后发布权力 01001000。01001001.
前8个忽略前三个,他们决定它是否是资本,从右向左做2的幂(2^1,2^2^3^4^5)。然后把所有的字母加起来,只有一个,它=8,字母表中的八个字母是h,所以我们的第一位是字母h,在另一位试试看,这是一种将二进制数转换为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”一样,每个数字可以表示10个不同的数字[0-9],而不是16个不同的数字[0-f]。)
一旦你知道了这个图表,将任何二进制数字串转换成十六进制数字串是很简单的
比如说,
01000100 = 0100 0100 = 44 hex
1010001001110011 = 1010 0010 0111 0011 = a273 hex
很简单,对吧?将任意长度的二进制数转换为其十六进制等价数是一件简单的事情
(这是因为十六进制是以16为基数的,二进制是以2为基数的,16是2的四次幂,所以需要4个二进制数字才能构成1个十六进制数字。另一方面,10不是2的幂,所以我们不能很容易地将二进制转换成十进制。)
2-将十六进制数字串拆分为对。
将数字转换为ASCII时,每2个十六进制数字是一个字符。因此,将十六进制字符串分为两组数字
您可以将像7340298b392这样的十六进制数拆分为6对,如下所示:
7340298b392 = 07 34 02 98 b3 92
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
(注意,我在前面加了一个0,因为我有奇数个十六进制数字。)
这是6对十六进制数字,所以它将是6个字母。(除非我马上知道98、b3和92不是字母。我马上解释原因。)
3-将每对十六进制数字转换为十进制数。
将左数的(十进制等价物)乘以16,再加上第2位
例如,b3 hex=11*16+3,即110+66+3,即179。
(b十六进制是11位小数。)
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 = 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