从零画一个二维码(QR-Code)

EXCEL表格在顶部资源下载

数据编码

题目要求编码为‘电子科技大学 信息感知与标识 嘎嘎嘎 2019010801003’

在综合考虑之后确定最终的编码格式为‘电子科技大学,信息感知与标识,嘎嘎嘎 2019010801003’,其中的符号为中文符号。

则考虑使用混合编码模式,分为两部分汉字和数字进行编码。

在汉字部分因为使用类型为‘1101’的GB2312编码并未正确识别,我们改用**’8-bit Byte Mode‘**模式;在数字部分,因为位数并不是纯数字中常见的3的倍数,我们添加了空格,使用’Alphanumeric Mode‘,即字母数字混合模式。

汉字编码

首先对汉字部分进行编码,使用GB2312进行编码,每个汉字对应的十六进制和十进制值如下所示:

a = '电子科技大学,信息感知与标识,嘎嘎嘎'
a_hex = a.encode('gb2312')
print(len(a))
print(a_hex)
for i in a_hex:
    print(i, end=' ')
    
    
"""
18
b'\xb5\xe7\xd7\xd3\xbf\xc6\xbc\xbc\xb4\xf3\xd1\xa7\xa3\xac\xd0\xc5\xcf\xa2\xb8\xd0\xd6\xaa\xd3\xeb\xb1\xea\xca\xb6\xa3\xac\xc2\xe6\xb3\xa9\xc8\xbb'
181 231 215 211 191 198 188 188 180 243 209 167 163 172 208 197 207 162 184 208 214 170 211 235 177 234 202 182 163 172 194 230 179 169 200 187 
"""

随后将这些转换为八位的二进制数,并添加模式符和字符数量,规则如下所示:

image-20230624161655405


name_lst = []
for i in range(len(a)):
    index1 = a_hex[i * 2]
    index2 = a_hex[i * 2 + 1]
    str_temp = ''
    for j in [index1, index2]:
        temp = bin(j)[2:]
        str_temp += '0' * (8 - len(temp)) + temp
    name_lst.append(str_temp)
# print(name_lst)
count = '0' * (8 - len(bin(len(a) * 2)[2:])) + bin(len(a) * 2)[2:]
name_str = '0100' + count
for i in name_lst:
    name_str += i
print(f'len:{
     
     len(name_str)} data:{
     
     name_str}')

"""
len:300 data:010000100100101101011110011111010111110100111011111111000110101111001011110010110100111100111101000110100111101000111010110011010000110001011100111110100010101110001101000011010110101010101101001111101011101100011110101011001010101101101010001110101100110000101110011010110011101010011100100010111011
"""

得到的二进制串长度为4(模式)+8(计数)+18(汉字数) * 2(字节) * 8(比特)=300

学号编码

在这部分我们使用数字字母混合模式进行编码,其规则如下所示:

输入数据字符每两个字符被分为一组,被编码为11位二进制代码。第一个字符的字符值乘以45加第二个数字的字符值,字符值如下所示:

image-20230624162258233


value = {
   
   '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '0': 0, ' ': 36}
id_ori = ' 2019010801003'
id_str = '0010'	# 模式符
id_str += '000001110'	#	计数
for i in range(7):
    i1 = id_ori[i * 2]
    i2 = id_ori[i * 2 + 1]
    plus = bin(value[i1] * 45 + value[i2])[2:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值