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}")
相关推荐
Sirius.z9 小时前
第R6周:LSTM实现糖尿病探索与预测
python
名字还没想好☜9 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
·薯条大王9 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
Dxy123931021610 小时前
Python 如何使用 MySQL 的事务
python·mysql
一壶浊酒..12 小时前
Scrape Webpack练习
开发语言·javascript·webpack
命运之光13 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
命运之光13 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人13 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
今儿敲了吗14 小时前
Python ——第三方包
笔记·python
麒麟水手14 小时前
国产银河麒麟系统开发实录:跑通Streamlit,我踩过的6个坑
python