Python 简易实现 quoted-printable 编码

本文介绍了Python中对quoted-printable编码的简易实现,详细解释了编码原理,并通过示例展示了编码过程。同时,文章提到了quopri库作为编码的便捷工具,并分享了使用心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:

以下有关内容基于 Python 3

Python 简易实现 quoted-printable 编码

目录

1. 什么是 quoted-printable 编码
2. 举例说明
3. 具体代码
4. 代码运行展示
5. 使用 quopri 库
6. 心得总结

一、什么是 quoted-printable 编码

        quoted-printable 编码方法适用于所传送的数据中只有少量的非 ASCII 码,例如汉字。这种编码方法的要点就是对于可打印的 ASCII 码,除特殊字符等号 “=” 外,都不改变。等号 “=” 和不可打印的 ASCII 码以及非 ASCII 码的数据的编码方法是:现将每个字节的二进制代码用两个十六进制数字表示,然后在前面加上一个等号 “=”。
        例如,汉字的 “系统” 的二进制编码是:1100111 10110101 11001101 10110011(共有 32 位,但这四个字节都不是 ASCII码),其十六进制数字表示为:CFB5CDB3。用 quoted-printable 编码表示为:=CF=B5=CD=B3,这 12 个字符都是可打印的 ASCII 字符,它们的二进制编码需要 96 位,和原来的 32 位相比,开销达 200%。
        而等号 “=” 的二进制代码为 00111101,即十六进制的 3D,因此等号 “=” 的 quoted-printable 编码为 “=3D”。

相关内容,可参考:《计算机网络(第7版)》

二、举例说明

试将数据 01001100 10011101 00111001 进行 quoted-printable 编码,并得出最后传送的 ASCII 数据。这样的数据用 quoted-printable 编码后其编码开销有多大?
(1)01001100 1001101 00111001 有 3 个字节,中间的一个高位为 1,因此它不是 ASCII 码,需要使用 quoted-printable 编码。第一个和第三个字节是 ASCII 码,不变化。

(2)10011101 的十六进制表示是:9D,前面再加上等号 “=”,变成 “=9D”。

(3)=,9,D 的 8 位 ASCII 码分别为:
00111101 00111001 01000100
因此最后的结果是 5 个字节的数据:
01001100 00111101 00111001 01000100 00111001

(4)编码开销 = 5 - 3 = 2 字节。原来只有 3 字节的数据。用百分数表示的编码开销 = 2 3 \frac{2}{3} 32 = 66.7%

三、具体代码

class QuoPri():

    def __init__(self, string):
        self.string_orig_list = list(string)
        ascii_string1 = ''.join([chr(i) for i in range(33, 61)])
        ascii_string2 = ''.join([chr(i) for i in range(62, 127)])
        self.ascii_string = ascii_string1 + ascii_string2
        print("可打印的ascii码( '=' 和 ' '  除外): {}".format(len(self.ascii_string)))

    def encode(self):
        string_encode_list =[]
        for item in self.string_orig_list:
            if item in self.ascii_string:
                string_encode_list.append(item)
            else:
                item_encode = item.encode()
                item_encode_list = list(item_encode)
                for each in item_encode_list:
                    string_encode_list.append('=' + hex(each)[2: ].upper())
                
        return ''.join(string_encode_list)


if
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值