Sud0G
Sud0G
发布于 2024-06-22 / 35 阅读
0
0

HEX编码原理

出现原因

  • 易于阅读:二进制数据较长且不易理解,而十六进制表示法相对简洁。例如,一个字节(8 位二进制数)可以转换为两个十六进制数字,每个十六进制数字可以表示 4 位二进制数。因此,十六进制表示法比二进制更加简洁明了。

  • 方便调试和编程:程序员在编写和调试代码时,通常需要查看和操作内存地址或数据。这时,使用十六进制表示法更为直观和简便。

  • 紧凑表示:十六进制表示法比二进制更加紧凑,每个十六进制数字可以表示 4 位二进制数,从而减少了表示长度。

实际中编码谁

在 Hex 编码过程中,被编码的对象可以是各种类型的二进制数据,例如:

  • 字符数据:文本文件中的字符被编码为二进制数据,可以进一步转换为十六进制表示。

  • 数值数据:整数、浮点数等数值数据在计算机内部以二进制形式存储,可以转换为十六进制表示。

  • 图像数据:图像文件中的像素数据、颜色值等也是以二进制形式存储的,可以表示为十六进制数。

  • 网络数据:网络通信中的数据包、协议头等也是以二进制形式存在,可以用十六进制表示来分析和调试。

原理过程

  1. 将数据转换为二进制表示

  2. 将每个字节拆分成两个 4 位的部分 (高低位)

  3. 将 4 位二进制数转换为十六进制数

  4. 将两个十六进制数字合并形成最终的编码

tip:转换规则

  • 0000 -> 0

  • 0001 -> 1

  • 0010 -> 2

  • 0011 -> 3

  • 0100 -> 4

  • 0101 -> 5

  • 0110 -> 6

  • 0111 -> 7

  • 1000 -> 8

  • 1001 -> 9

  • 1010 -> A

  • 1011 -> B

  • 1100 -> C

  • 1101 -> D

  • 1110 -> E

  • 1111 -> F

示例

字符 A 的 ASCII 码是 65,二进制表示为 01000001。

步骤二

高低位(前四位):0100

低四位(后四位):0001

步骤三

0100 -> 4

0001 -> 1

步骤四

A的Hex编码为41

tip:这里为什么没有像网上所说的补0呢?

将提取出来的高/低四位前面补全4个0,是为了 为了表示完整的 8 位字节,将每个 4 位数补全为 8 位二进制数 ,并不是 Hex 编码的实际步骤。

编/解码代码实现

def hex_encode(data):
    hex_str = ''
    for byte in data:
        high_nibble = (byte >> 4) & 0x0F
        low_nibble = byte & 0x0F
        hex_str += '{:X}{:X}'.format(high_nibble, low_nibble)
    return hex_str


def hex_decode(hex_str):
    if len(hex_str) % 2 != 0:
        raise ValueError("十六进制字符串的长度必须是偶数")

    data = bytearray()
    for i in range(0, len(hex_str), 2):
        high_nibble = int(hex_str[i], 16) << 4
        low_nibble = int(hex_str[i + 1], 16)
        byte = high_nibble | low_nibble
        data.append(byte)
    return bytes(data)


def main():
    ascii_art = r"""
 _                      _         __                       _      
| |__   _____  __    __| | ___   / /__ _ __   ___ ___   __| | ___ 
| '_ \ / _ \ \/ /   / _` |/ _ \ / / _ \ '_ \ / __/ _ \ / _` |/ _ \
| | | |  __/>  <   | (_| |  __// /  __/ | | | (_| (_) | (_| |  __/
|_| |_|\___/_/\_\___\__,_|\___/_/ \___|_| |_|\___\___/ \__,_|\___|
"""

    print(ascii_art)

    while True:
        print("==============")
        print("请选择操作:")
        print("1. 编码")
        print("2. 解码")
        print("3. 退出")
        choice = input("输入选项(1/2/3): ")

        if choice == '1':
            user_input = input("请输入要编码的字符串: ")
            encoded_data = hex_encode(user_input.encode('utf-8'))
            print(f"编码结果: {encoded_data}")

        elif choice == '2':
            user_input = input("请输入要解码的十六进制字符串: ")
            try:
                decoded_data = hex_decode(user_input)
                print(f"解码结果: {decoded_data.decode('utf-8')}")
            except ValueError as e:
                print(f"解码错误: {e}")

        elif choice == '3':
            print("退出程序")
            break

        else:
            print("无效的选项,请重新选择")


if __name__ == "__main__":
    main()


评论