PythoN实现有符号十进制与十六进制之间转换

在线运行环境

===== 1. 有符号十进制转十六进制 =====

===== 2. 随机负十进制数及对应16位十六进制 =====

===== 3. 有符号十六进制转十进制 =====

bash 复制代码
import random
from typing import Tuple  # 兼容Python 3.9以下版本的类型注解

def signed_dec_to_hex(decimal_num: int) -> Tuple[str, str]:
    """
    将有符号十进制数转换为 两字节(16位) 和 四字节(32位) 的十六进制字符串(大端序,无空格)
    :param decimal_num: 有符号十进制整数
    :return: (两字节十六进制字符串, 四字节十六进制字符串)
    """
    try:
        # 转换为两字节(16位)有符号数的十六进制,大端序,补零到4位
        two_byte_hex = int.to_bytes(decimal_num, length=2, byteorder="big", signed=True).hex()
        # 转换为四字节(32位)有符号数的十六进制,大端序,补零到8位
        four_byte_hex = int.to_bytes(decimal_num, length=4, byteorder="big", signed=True).hex()
        return two_byte_hex, four_byte_hex
    except OverflowError:
        raise ValueError(f"数值 {decimal_num} 超出对应字节范围:\n"
                         f"两字节(16位)范围:[-32768, 32767]\n"
                         f"四字节(32位)范围:[-2147483648, 2147483647]")

def generate_random_negative_dec() -> Tuple[int, str]:
    """
    生成随机负十进制数,并转换为对应的16位(两字节)十六进制字符串
    :return: (随机负十进制数, 对应的16位十六进制字符串)
    """
    # 16位有符号数的负数范围:-32768 ~ -1
    min_neg = -32768
    max_neg = -1
    random_neg = random.randint(min_neg, max_neg)
    # 转换为16位十六进制
    hex_str = int.to_bytes(random_neg, length=2, byteorder="big", signed=True).hex()
    return random_neg, hex_str

def signed_hex_to_dec(hex_str: str) -> Tuple[int, int]:
    """
    将有符号十六进制字符串转换为 两字节(16位) 和 四字节(32位) 对应的十进制值(大端序)
    :param hex_str: 十六进制字符串(支持带/不带0x、大小写、空格,如ffd5、0xFF D5)
    :return: (两字节对应十进制, 四字节对应十进制)
    """
    # 预处理:去除空格、去除0x前缀、转小写
    hex_clean = hex_str.replace(" ", "").replace("0x", "").lower()
    
    try:
        # 转换为字节流
        hex_bytes = bytes.fromhex(hex_clean)
    except ValueError:
        raise ValueError(f"输入的十六进制字符串 {hex_str} 格式无效")
    
    # 1. 转换为两字节(16位)有符号十进制(不足补零,超出截断后4位)
    two_byte_bytes = hex_bytes[-2:] if len(hex_bytes) >= 2 else hex_bytes.zfill(2)
    two_byte_dec = int.from_bytes(two_byte_bytes, byteorder="big", signed=True)
    
    # 2. 转换为四字节(32位)有符号十进制(不足补零,超出截断后8位)
    four_byte_bytes = hex_bytes[-4:] if len(hex_bytes) >= 4 else hex_bytes.zfill(4)
    four_byte_dec = int.from_bytes(four_byte_bytes, byteorder="big", signed=True)
    
    return two_byte_dec, four_byte_dec

# ------------------- 测试示例 -------------------
if __name__ == "__main__":
    print("===== 1. 有符号十进制转十六进制 =====")
    test_num = -23578  # 可修改为任意有符号十进制数
    two_hex, four_hex = signed_dec_to_hex(test_num)
    print(f"指定有符号十进制数:{test_num}")
    print(f"对应两字节(16位)十六进制:{two_hex}")
    print(f"对应四字节(32位)十六进制:{four_hex}\n")

    print("===== 2. 随机负十进制数及对应16位十六进制 =====")
    random_num, random_hex = generate_random_negative_dec()
    print(f"随机负十进制数:{random_num}")
    print(f"对应16位(两字节)十六进制:{random_hex}\n")

    print("===== 3. 有符号十六进制转十进制 =====")
    test_hex = "ffd5"  # 可修改为任意两字节/四字节十六进制(如ffd5、ffffffd5、0xFF D5)
    two_dec, four_dec = signed_hex_to_dec(test_hex)
    print(f"指定有符号十六进制数:{test_hex}")
    print(f"对应两字节(16位)十进制:{two_dec}")
    print(f"对应四字节(32位)十进制:{four_dec}")
相关推荐
ZHOUPUYU5 小时前
PHP 8.3网关优化:我用JIT将QPS提升300%的真实踩坑录
开发语言·php
寻寻觅觅☆9 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
YJlio9 小时前
1.7 通过 Sysinternals Live 在线运行工具:不下载也能用的“云端工具箱”
c语言·网络·python·数码相机·ios·django·iphone
l1t10 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
赶路人儿10 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar12311 小时前
C++使用format
开发语言·c++·算法
山塘小鱼儿11 小时前
本地Ollama+Agent+LangGraph+LangSmith运行
python·langchain·ollama·langgraph·langsimth
码说AI11 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS11 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化