​​​​​​





前言

 这罪恶的根源在于一个题目......害!!!!


我靠,啧啧啧.....这么一串是个啥?

 原来啊,这是一串8位二进制表示的ASCII编码!




一、ASCII码及其它编码发展的介绍

  1. ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)

由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A的编码是65,小写字母 z的编码是122。后128个称为扩展ASCII码。

ASCII编码:

空格(0)对应的ASCII码就是是0;对勾(251)对应的ASCII码是11111011。如果我们想要表示一个空格+对勾,那么就是0+11111011,但是放在一起就是011111011,该怎样”断句“呢?显然出现了混乱,故而: 

由于编码表中最多255个字符,所以人们想到了用八位二进制来表示这些字符。比如A(65)对应的二进制码就是1000001,不足8位在前面补0,所以01000001。所以空格+对勾就可以表示为0000000011111011,读取的时候每八位读取一个字符即可。

2.GB2312 & GBK(中国人自己的编码)

很显然,ASCII编码只能显示英文,不能显示汉字,美国佬当年在造计算机的时候肯定也没想到,中国人有一天也会用上计算机,上世界80年代,电脑进入中国,专家们是头疼啊!我中华文化博大精深,光常用汉字就有几千个,你一张ASCII编码表也装不了啊,但是但是,我们中国人从来不怕困难,没有我们就自己造呗,于是,GB2312(存了6763个汉字)就诞生了!

 后来,在1995年,专家们又升级了GB2312,也就是现在windows电脑中文版本的编码:GBK.

 3.Unicode(万国码)

在计算机高速发展的那个年代,各个国家都在发展属于自己的编码,中国的GB2312,日本的Shift_JIS,韩国的Euc-kr,于是啊,问题就出现了,你GB2312编写的代码在日本的终端上不能运行,是一堆乱码,这就是编码的混战时代,这可咋整呢?后来是联合国调解,统一了所有的语言,将其放在了Unicode里,这就是万国码的由来!




二、解决方案




1.解码ASCII编码

其实要实现ASCII编码的解码是很简单的,首先,需要将8位二进制数转换为十进制数,再利用python自带的chr函数将十进制数转为ASCII编码表中对应的字符就行了!

代码如下:

print("欢迎使用mc开发的程序!".center(50, '*'),"\n")   # 本人的个性标签
print("请输入你需要解码的code:")
a = input("code:")
li = list(a)    # 先将需要转译的编码由8位二进制码转为列表,便于后面程序的操作
b = []          # 空列表b用于存放解码出来的字符串
m = 0
n = 7
while n <= len(li):
 x = li[m:n+1:1]       # 将列表进行切片处理
 b.append(x)
 m += 9
 n += 9                # 此处用到算法是为了将空格给去掉,每8位跳一次
print(b,len(b))            # 打印b,看看是否出现错误,此处已经实验过,需要的话请取消注释
for i in range(len(b)):
    print(len(b[i]),end="")
print('\n')
print("Please judge it's True or False by 8888......always") # 判断是否出现错误,保证每一个元素b[i]都是8位二进制数以免后面转译的时候出错
print("\n")
print("破译成功***你所破译的编码意思是:")
# 定义一个进制转换并输出ASCII字符函数
def two_translate_ten(x):
    i = 0
    sum = 0
    while i <= 7:
        sum += int(x[i]) * 2**(7-i)
        i += 1
    print(chr(sum),end="")              # 将10进制数转换为对应的ASCII字符并无换行输出
    return 0
j = 0
while j <= len(b)-1:
    x = b[j]
    two_translate_ten(x)
    j += 1                               # 循环调用 two_translate_ten(x)函数
print("\n")
print("感谢使用mc开发的程序!".center(60, '*'))
print("\n")
# for k in range(len(b)):
#     two_translate_ten(b[k])
# 此处代码存在一定的问题,在于切片后的列表内还是一个个小的列表,如果要调用这些小列表里面的数据,就需要进行赋值转换




程序运行演示:

*******************欢迎使用mc开发的程序!******************* 

请输入你需要解码的code:      # 这里直接复制粘贴所需要解码的代码就行了
code:01001100 01101111 01100111 01101001 01100011 00100000 01110111 01101001 01101100 01101100 00100000 01100111 01100101 01110100 00100000 01111001 01101111 01110101 00100000 01100110 01110010 01101111 01101101 00100000 01000001 00100000 01110100 01101111 00100000 01000010 00101110 00100000 01001001 01101101 01100001 01100111 01101001 01101110 01100001 01110100 01101001 01101111 01101110 00100000 01110111 01101001 01101100 01101100 00100000 01110100 01100001 01101011 01100101 00100000 01111001 01101111 01110101 00100000 01100101 01110110 01100101 01110010 01111001 01110111 01101000 01100101 01110010 01100101 00101110
888888888888888888888888888888888888888888888888888888888888888888888

Please judge it's True or False by 8888......always


破译成功***你所破译的编码意思是:
Logic will get you from A to B. Imagination will take you everywhere.

************************感谢使用mc开发的程序!************************

Logic will get you from A to B. Imagination will take you everywhere.

(逻辑会带你从A到B,想象会带你到任何地方)

显然,这就是一开始我们提到的那个题目的答案了!

在这个代码中我们需要注意的是题目给出的代码每8位间是有一个空格的,所以在必须将空格去掉,用列表的切片功能就可以实现了!

2.编码ASCII码

其实这个设计是当时在写完上一个编码后突发奇想想要实现的!既然我能够将一段ASCII编码解码为一段英文输出,那么我也一定能够将一段英文编码为一段ASCII编码啦!

代码如下:

print("欢迎使用mc开发的程序!".center(50, '*'))   # 本人的个性标签
print("Please write your code:")
x = input("code:")
i = 0
st = []
# 定义一个10进制转二进制的函数
def two_transfer(x):
    a = []
    while x != 0:
        a.append(x%2)
        x =int(x/2)
    a.reverse()
    while len(a) != 8:
        a.insert(0,0)        # 避免二进制数不满足8位码的要求,需要在二进制码前面补0
    st.append(a)
    print(a)
    return st                # 返回st,用于后面的调用
while i <= len(x)-1:
    y = ord(x[i])            # 转为十进制数
    two_transfer(y)          # 调用10进制转二进制函数,将10进制转为2进制数
    i += 1
print("\n")
print("Translating your words into codes is successful,it's (你的代码已编译成功):")
print("\n")
for k in st:
    k.insert(8,' ')          # 加空格
    for i in range(len(k)):
        print ("".join(str(k[i])),end='')   # 将‘’去掉后输出
print("\n")
print("\n","感谢使用mc开发的程序!".center(60, '*'))

为了实现能够与前面的解码程序相兼容,这里我们用了.insert (8,' ')插入了一个空格

下面我们以编码歌曲《Star Sky》歌词为例:“Here we are !Riding the sky,Painting the night with sun,You and I, Mirrors of light,Twin flames of fire,Lit in another time and place,I knew your name,I knew your face,Your love and grace,Past and present now embrace,Worlds collide in inner space,Unstoppable, the song we play!”

代码运行情况:

*******************欢迎使用mc开发的程序!*******************
Please write your code:
code:Here we are !Riding the sky,Painting the night with sun,You and I, Mirrors of light,Twin flames of fire,Lit in another time and place,I knew your name,I knew your face,Your love and grace,Past and present now embrace,Worlds collide in inner space,Unstoppable, the song we play

Translating your words into codes is successful,it's (你的代码已编译成功):


01001000 01100101 01110010 01100101 00100000 01110111 01100101 00100000 01100001 01110010 01100101 00100000 00100001 01010010 01101001 01100100 01101001 01101110 01100111 00100000 01110100 01101000 01100101 00100000 01110011 01101011 01111001 00101100 01010000 01100001 01101001 01101110 01110100 01101001 01101110 01100111 00100000 01110100 01101000 01100101 00100000 01101110 01101001 01100111 01101000 01110100 00100000 01110111 01101001 01110100 01101000 00100000 01110011 01110101 01101110 00101100 01011001 01101111 01110101 00100000 01100001 01101110 01100100 00100000 01001001 00101100 00100000 01001101 01101001 01110010 01110010 01101111 01110010 01110011 00100000 01101111 01100110 00100000 01101100 01101001 01100111 01101000 01110100 00101100 01010100 01110111 01101001 01101110 00100000 01100110 01101100 01100001 01101101 01100101 01110011 00100000 01101111 01100110 00100000 01100110 01101001 01110010 01100101 00101100 01001100 01101001 01110100 00100000 01101001 01101110 00100000 01100001 01101110 01101111 01110100 01101000 01100101 01110010 00100000 01110100 01101001 01101101 01100101 00100000 01100001 01101110 01100100 00100000 01110000 01101100 01100001 01100011 01100101 00101100 01001001 00100000 01101011 01101110 01100101 01110111 00100000 01111001 01101111 01110101 01110010 00100000 01101110 01100001 01101101 01100101 00101100 01001001 00100000 01101011 01101110 01100101 01110111 00100000 01111001 01101111 01110101 01110010 00100000 01100110 01100001 01100011 01100101 00101100 01011001 01101111 01110101 01110010 00100000 01101100 01101111 01110110 01100101 00100000 01100001 01101110 01100100 00100000 01100111 01110010 01100001 01100011 01100101 00101100 01010000 01100001 01110011 01110100 00100000 01100001 01101110 01100100 00100000 01110000 01110010 01100101 01110011 01100101 01101110 01110100 00100000 01101110 01101111 01110111 00100000 01100101 01101101 01100010 01110010 01100001 01100011 01100101 00101100 01010111 01101111 01110010 01101100 01100100 01110011 00100000 01100011 01101111 01101100 01101100 01101001 01100100 01100101 00100000 01101001 01101110 00100000 01101001 01101110 01101110 01100101 01110010 00100000 01110011 01110000 01100001 01100011 01100101 00101100 01010101 01101110 01110011 01110100 01101111 01110000 01110000 01100001 01100010 01101100 01100101 00101100 00100000 01110100 01101000 01100101 00100000 01110011 01101111 01101110 01100111 00100000 01110111 01100101 00100000 01110000 01101100 01100001 01111001 


 ************************感谢使用mc开发的程序!************************

可以看到我们已经能够将一段英文转换为ASCII编码啦!


 并且每8位一个字符,空格隔开,可以与解码程序相容,感兴趣的读者可以尝试一下。

示范:

*******************欢迎使用mc开发的程序!******************* 

请输入你需要解码的code:
code:01001000 01100101 01110010 01100101 00100000 01110111 01100101 00100000 01100001 01110010 01100101 00100000 00100001 01010010 01101001 01100100 01101001 01101110 01100111 00100000 01110100 01101000 01100101 00100000 01110011 01101011 01111001 00101100 01010000 01100001 01101001 01101110 01110100 01101001 01101110 01100111 00100000 01110100 01101000 01100101 00100000 01101110 01101001 01100111 01101000 01110100 00100000 01110111 01101001 01110100 01101000 00100000 01110011 01110101 01101110 00101100 01011001 01101111 01110101 00100000 01100001 01101110 01100100 00100000 01001001 00101100 00100000 01001101 01101001 01110010 01110010 01101111 01110010 01110011 00100000 01101111 01100110 00100000 01101100 01101001 01100111 01101000 01110100 00101100 01010100 01110111 01101001 01101110 00100000 01100110 01101100 01100001 01101101 01100101 01110011 00100000 01101111 01100110 00100000 01100110 01101001 01110010 01100101 00101100 01001100 01101001 01110100 00100000 01101001 01101110 00100000 01100001 01101110 01101111 01110100 01101000 01100101 01110010 00100000 01110100 01101001 01101101 01100101 00100000 01100001 01101110 01100100 00100000 01110000 01101100 01100001 01100011 01100101 00101100 01001001 00100000 01101011 01101110 01100101 01110111 00100000 01111001 01101111 01110101 01110010 00100000 01101110 01100001 01101101 01100101 00101100 01001001 00100000 01101011 01101110 01100101 01110111 00100000 01111001 01101111 01110101 01110010 00100000 01100110 01100001 01100011 01100101 00101100 01011001 01101111 01110101 01110010 00100000 01101100 01101111 01110110 01100101 00100000 01100001 01101110 01100100 00100000 01100111 01110010 01100001 01100011 01100101 00101100 01010000 01100001 01110011 01110100 00100000 01100001 01101110 01100100 00100000 01110000 01110010 01100101 01110011 01100101 01101110 01110100 00100000 01101110 01101111 01110111 00100000 01100101 01101101 01100010 01110010 01100001 01100011 01100101 00101100 01010111 01101111 01110010 01101100 01100100 01110011 00100000 01100011 01101111 01101100 01101100 01101001 01100100 01100101 00100000 01101001 01101110 00100000 01101001 01101110 01101110 01100101 01110010 00100000 01110011 01110000 01100001 01100011 01100101 00101100 01010101 01101110 01110011 01110100 01101111 01110000 01110000 01100001 01100010 01101100 01100101 00101100 00100000 01110100 01101000 01100101 00100000 01110011 01101111 01101110 01100111 00100000 01110111 01100101 00100000 01110000 01101100 01100001 01111001 
888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888

Please judge it's True or False by 8888......always


破译成功***你所破译的编码意思是:
Here we are !Riding the sky,Painting the night with sun,You and I, Mirrors of light,Twin flames of fire,Lit in another time and place,I knew your name,I knew your face,Your love and grace,Past and present now embrace,Worlds collide in inner space,Unstoppable, the song we play

************************感谢使用mc开发的程序!************************



Process finished with exit code 0

 编码与解码程序是相兼容的!




结语

这个问题到此就算是解决了!害....!!!真不容易啊!

OK,有问题可以留言询问哦!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐