===== 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}")