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字符集中的码点映射,请参阅
好的,下面是两个步骤:

  • 如果数据是文本数据,则必须以某种方式伴随字符编码,如UTF-8、Latin-1、US-ASCII等。每个字符编码方案都非常详细地指定了字节序列如何解释为码点(反之亦然,码点如何编码为字节序列)

  • 一旦字节序列被解释为代码点,您就拥有了您的字符,因为每个字符都有一个特定的代码点

  • 几点注意:

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

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

    为什么不把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