二进制代码究竟是如何转换成字母的?

时间:2011-07-26 07:12:44

标签: binary

出于好奇,二进制代码究竟是如何转换成字母的?我知道有些网站会自动将二进制文件转换为单词,但我想了解二进制代码在转换为字母之前经过的具体中间步骤。

6 个答案:

答案 0 :(得分:20)

假设“二进制代码”是指普通旧数据(比特或字节序列),而“字母”表示字符,答案分为两步。但首先是一些背景知识。

  • 角色只是一个命名符号,如“LATIN CAPITAL LETTER A”或“GREEK SMALL LETTER PI”或“BLACK CHESS KNIGHT”。不要将字符(抽象符号)与字形(字符图片)混淆。
  • 字符集是一组特定的字符,每个字符都与一个特殊的数字相关联,称为其代码点。要查看Unicode字符集中的代码点映射,请参阅http://www.unicode.org/Public/UNIDATA/UnicodeData.txt

现在好了,这是两个步骤:

  1. 数据(如果是文本的话)必须以某种方式附加字符编码,类似于UTF-8,Latin-1,US-ASCII等。每个字符编码方案详细说明了如何将字节序列解释为代码点(相反,如何将代码点编码为字节序列)。

  2. 一旦字节序列被解释为代码点,就会有你的字符,因为每个字符都有一个特定的代码点。

  3. 一对夫妇注意到:

    • 在某些编码中,某些字节序列根本不对应任何代码点,因此您可能会出现字符解码错误。
    • 在某些字符集中,有一些未使用的代码点,也就是说,它们根本不对应任何字符。

    换句话说,并非每个字节序列都意味着文本。

答案 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)

您的意思是转化011001100110111101101111foo吗?您只需获取二进制流,将其拆分为单独的字节(011001100110111101101111),然后查找与给定数字对应的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,在另一位尝试它