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}")
相关推荐
weixin_408099674 分钟前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
爱喝水的鱼丶18 分钟前
SAP-ABAP:ALV通用封装实践——搭建可复用的ALV开发工具类,减少80%重复代码
开发语言·性能优化·sap·abap·erp·alv
去码头整点薯条ing39 分钟前
某当网登录滑块【协议+OCR】
爬虫·python·ocr
脱胎换骨-军哥40 分钟前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
songroom1 小时前
Kimi K3:Rust封装XTP接口详细教程实践
开发语言·后端·rust
kebeiovo1 小时前
游戏服务端开发:Actor模型详解(Go语言)
开发语言·后端·golang
赶紧写完去睡觉1 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda
迷途呀1 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp
Herbert_hwt2 小时前
建立Java程序开发
java·开发语言
你驴我2 小时前
WhatsApp 多账号下消息已读回执的实时聚合与推送实践
后端·python