编码规则
分组编码:编码时将待编码的数字分为7位一组,每个字节的低7位用于存储待编码数字的补码。
最高位标记:字节的最高位用于表示后续是否还有字节,置1表示后面还有更多的字节,置0表示当前字节为最后一个字节。
小端序编码:采用小端序编码,低位和低字节放在低地址上。
16进制输出:编码结果按16进制数的字符格式输出,小写字母需转换为大写字母。不足两位的前面补0,如00、01、02等。
示例
输入:1000
输出:E807
1000的二进制表示为0011 1110 1000,至少需要两个字节进行编码。
第一个字节的最高位置1,剩余的7位存储数字1000的第一个低7位(1101000),所以第一个字节的二进制为1110 1000,即E8。
第二个字节的最高位置0,剩余的7位存储数字1000的第二个低7位(0000111),所以第二个字节的二进制为0000 0111,即07。
采用小端序编码,所以低字节E8输出在前,高字节07输出在后
s = int(input('请输入一个整数字符串: '))
s = bin(s)[2:]
print(s)
result = ''
for i in range(len(s), 0, -7):
loc = '1' if i > 7 else '0'
result_16 = hex(int(loc+s[max(i-7, 0):i],2))[2:]
# 1111101000 ===>>> [0:3],[3:10]
if len(result_16)<2:
result_16 = '0'+result_16
else:
result_16 = result_16
result += result_16
print(''.join(result).upper())
实现流程
十进制: 1000
二进制: "1111101000" (长度10)
循环1: i=10
- loc = '1' (i>7)
- 数据: s[3:10] = "1101000"
- 字节: "1" + "1101000" = "11101000" = 0xE8
循环2: i=3
- loc = '0' (i≤7)
- 数据: s[0:3] = "111"
- 字节: "0" + "111" = "00000111" = 0x07
最终结果: "E807"另外一种实现方式:位运算
def encode_integer(num_str):
result = []
num = int(num_str)
while num > 0:
byte = num & 0x7F # 取最低7位
num >>= 7 # 右移7位
if num > 0:
byte |= 0x80 # 设置最高位为1
result.append(f"{byte:02X}")
return ''.join(result) # 去掉反转
print(encode_integer('1000'))技巧解析
& 0x7F:掩码操作,保留最低7位>>= 7:右移7位,高效除法|= 0x80:设置最高位为1:02X字节对齐:每个字节必须用2位十六进制表示
完整流程示例:数字 1000
第一次循环:
num = 1000
byte = 1000 & 0x7F = 104 # 取最低7位: 1101000
num >>= 7 → num = 7 # 准备处理下一组
num > 0 → byte |= 0x80 # 设置最高位: 11101000 = 232
result: ['E8'] # 232 = 0xE8第二次循环:
num = 7
byte = 7 & 0x7F = 7 # 取最低7位: 0000111
num >>= 7 → num = 0 # 没有更多数据了
num = 0 → 不设置最高位 # 保持: 00000111 = 7
result: ['E8', '07'] # 7 = 0x07最终结果:E807