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
"""
随后将这些转换为八位的二进制数,并添加模式符和字符数量,规则如下所示:
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加第二个数字的字符值,字符值如下所示:
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: