200字
整数编码
2025-11-29
2025-11-29

编码规则

  1. 分组编码:编码时将待编码的数字分为7位一组,每个字节的低7位用于存储待编码数字的补码。

  2. 最高位标记:字节的最高位用于表示后续是否还有字节,置1表示后面还有更多的字节,置0表示当前字节为最后一个字节。

  3. 小端序编码:采用小端序编码,低位和低字节放在低地址上。

  4. 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'))

技巧解析

  1. & 0x7F:掩码操作,保留最低7位

  2. >>= 7:右移7位,高效除法

  3. |= 0x80:设置最高位为1

  4. :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

整数编码
作者
Shisuiyi
发表于
2025-11-29
License
CC BY-NC-SA 4.0

评论