进制转换助手(内含IEEE75416进制转10进制)

查看 38|回复 6
作者:蛋蛋的小忧伤   
[color=]开发这个小工具的原因呢是因为工作需要,需要来计算IEEE754的转换,直接问Deepseek和豆包,这两个都是傻子,没一个给的计算结果是对的。
[color=]迫于无奈让Deepseek先给我写了计算过程,再来生成的代码,试了一下还是不错。
[color=]为了避免软件的单调性,我也将最基础的多进制相互转换加入了进来
[color=]之前在论坛评论区有这种计算工具,但是无人分享,实属无奈。

[Python] 纯文本查看 复制代码import tkinter as tk
from tkinter import ttk
import struct
import binascii
class BaseConverterApp:
    def __init__(self, root):
        self.root = root
        self.root.title("进制转换器 By JS")
        self.root.geometry("900x550")
        self.root.configure(bg="#f0f0f0")
        # 创建选项卡
        self.tab_control = ttk.Notebook(root)
        # 创建四个选项卡
        self.tab1 = ttk.Frame(self.tab_control)
        self.tab2 = ttk.Frame(self.tab_control)
        self.tab3 = ttk.Frame(self.tab_control)
        self.tab4 = ttk.Frame(self.tab_control)  # 新增的第四个选项卡
        self.tab_control.add(self.tab1, text='进制转换')
        self.tab_control.add(self.tab2, text='16#高前低后')
        self.tab_control.add(self.tab4, text='16#低前高后')  # 新增的选项卡
        self.tab_control.add(self.tab3, text='IEEE754计算')
        self.tab_control.pack(expand=1, fill="both")
        # 初始化各个选项卡
        self.create_tab1()
        self.create_tab2()
        self.create_tab3()
        self.create_tab4()  # 初始化新增选项卡
        # 状态栏
        self.status_bar = tk.Label(root, text="就绪", bd=1, relief=tk.SUNKEN, anchor=tk.W)
        self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)
    def update_status(self, message):
        self.status_bar.config(text=message)
        self.root.after(3000, lambda: self.status_bar.config(text="就绪"))
    def create_tab1(self):
        # 基本进制转换界面
        tab = self.tab1
        tab.configure(style='TFrame')
        # 标题
        title = tk.Label(tab, text="进制相互转换", font=("Arial", 16, "bold"), bg="#f0f0f0")
        title.pack(pady=10)
        # 输入框和标签
        input_frame = tk.Frame(tab, bg="#f0f0f0")
        input_frame.pack(pady=10)
        tk.Label(input_frame, text="输入数值:", bg="#f0f0f0").grid(row=0, column=0, padx=5, pady=5)
        self.input_entry = tk.Entry(input_frame, width=25, font=("Arial", 12))
        self.input_entry.grid(row=0, column=1, padx=5, pady=5)
        tk.Label(input_frame, text="输入进制:", bg="#f0f0f0").grid(row=0, column=2, padx=5, pady=5)
        self.input_base = ttk.Combobox(input_frame, values=["2", "8", "10", "16"], width=10, state="readonly")
        self.input_base.grid(row=0, column=3, padx=5, pady=5)
        self.input_base.current(2)  # 默认十进制
        # 转换按钮
        convert_btn = tk.Button(tab, text="转换", command=self.convert_base, bg="#4CAF50", fg="white",
                                font=("Arial", 12, "bold"), padx=15)
        convert_btn.pack(pady=10)
        # 结果显示区域
        result_frame = tk.Frame(tab, bg="#e0e0e0", padx=10, pady=10, relief=tk.GROOVE, bd=2)
        result_frame.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
        tk.Label(result_frame, text="转换结果:", font=("Arial", 12, "bold"), bg="#e0e0e0").pack(anchor="w")
        self.result_text = tk.Text(result_frame, height=8, width=70, font=("Consolas", 11), bg="white")
        self.result_text.pack(fill=tk.BOTH, expand=True, pady=5)
        self.result_text.insert(tk.END, "结果将显示在这里...")
        self.result_text.config(state=tk.DISABLED)
        # 示例标签
        examples = tk.Label(tab, text="示例: 二进制: 1101, 八进制: 75, 十进制: 123, 十六进制: FF",
                            bg="#f0f0f0", fg="#666")
        examples.pack(pady=(0, 10))
    def create_tab2(self):
        # 16进制转10进制(高位在前)
        tab = self.tab2
        tab.configure(style='TFrame')
        # 标题
        title = tk.Label(tab, text="16进制转10进制(高位在前,低位在后)", font=("Arial", 16, "bold"), bg="#f0f0f0")
        title.pack(pady=10)
        # 说明
        desc = tk.Label(tab, text="输入4字节的16进制数据(例如: 01 02 03 04)", bg="#f0f0f0")
        desc.pack(pady=5)
        # 输入框
        input_frame = tk.Frame(tab, bg="#f0f0f0")
        input_frame.pack(pady=10)
        tk.Label(input_frame, text="16进制输入:", bg="#f0f0f0").grid(row=0, column=0, padx=5, pady=5)
        self.hex_input = tk.Entry(input_frame, width=30, font=("Arial", 12))
        self.hex_input.grid(row=0, column=1, padx=5, pady=5)
        self.hex_input.insert(0, "01 02 03 04")
        # 转换按钮
        convert_btn = tk.Button(tab, text="转换", command=self.convert_hex_to_int_big, bg="#2196F3", fg="white",
                                font=("Arial", 12, "bold"), padx=15)
        convert_btn.pack(pady=10)
        # 结果区域
        result_frame = tk.Frame(tab, bg="#e0e0e0", padx=10, pady=10, relief=tk.GROOVE, bd=2)
        result_frame.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
        tk.Label(result_frame, text="转换结果:", font=("Arial", 12, "bold"), bg="#e0e0e0").pack(anchor="w")
        self.int_result_big = tk.Label(result_frame, text="", font=("Arial", 14), bg="white",
                                       width=30, height=2, relief=tk.SUNKEN, padx=10, anchor="w")
        self.int_result_big.pack(fill=tk.X, pady=5)
        # 字节顺序解释
        explanation = tk.Label(tab,
                               text="高位在前顺序(大端序): 第一个字节是最高有效字节(例如: 01 02 03 04 → 0x01020304)",
                               bg="#f0f0f0", fg="#666")
        explanation.pack(pady=(5, 10))
        # 示例值
        examples = tk.Label(tab,
                            text="示例值: 01 02 03 04 = 16,909,060 | 00 00 00 01 = 1 | FF FF FF FF = 4,294,967,295",
                            bg="#f0f0f0", fg="#666")
        examples.pack(pady=(0, 5))
    def create_tab4(self):
        # 16进制转10进制(低位在前) - 新增选项卡
        tab = self.tab4
        tab.configure(style='TFrame')
        # 标题
        title = tk.Label(tab, text="16进制转10进制(低位在前,高位在后)", font=("Arial", 16, "bold"), bg="#f0f0f0")
        title.pack(pady=10)
        # 说明
        desc = tk.Label(tab, text="输入4字节的16进制数据(例如: 04 03 02 01)", bg="#f0f0f0")
        desc.pack(pady=5)
        # 输入框
        input_frame = tk.Frame(tab, bg="#f0f0f0")
        input_frame.pack(pady=10)
        tk.Label(input_frame, text="16进制输入:", bg="#f0f0f0").grid(row=0, column=0, padx=5, pady=5)
        self.hex_input_little = tk.Entry(input_frame, width=30, font=("Arial", 12))
        self.hex_input_little.grid(row=0, column=1, padx=5, pady=5)
        self.hex_input_little.insert(0, "04 03 02 01")
        # 转换按钮
        convert_btn = tk.Button(tab, text="转换", command=self.convert_hex_to_int_little, bg="#9C27B0", fg="white",
                                font=("Arial", 12, "bold"), padx=15)
        convert_btn.pack(pady=10)
        # 结果区域
        result_frame = tk.Frame(tab, bg="#e0e0e0", padx=10, pady=10, relief=tk.GROOVE, bd=2)
        result_frame.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
        tk.Label(result_frame, text="转换结果:", font=("Arial", 12, "bold"), bg="#e0e0e0").pack(anchor="w")
        self.int_result_little = tk.Label(result_frame, text="", font=("Arial", 14), bg="white",
                                          width=30, height=2, relief=tk.SUNKEN, padx=10, anchor="w")
        self.int_result_little.pack(fill=tk.X, pady=5)
        # 字节顺序解释
        explanation = tk.Label(tab,
                               text="低位在前顺序(小端序): 第一个字节是最低有效字节(例如: 04 03 02 01 → 0x01020304)",
                               bg="#f0f0f0", fg="#666")
        explanation.pack(pady=(5, 10))
        # 示例值
        examples = tk.Label(tab,
                            text="示例值: 04 03 02 01 = 16,909,060 | 01 00 00 00 = 1 | FF FF FF FF = 4,294,967,295",
                            bg="#f0f0f0", fg="#666")
        examples.pack(pady=(0, 5))
        # 对比说明
        comparison = tk.Label(tab, text="对比: 高位在前(01 02 03 04)与低位在前(04 03 02 01)的结果相同",
                              bg="#f0f0f0", fg="#006400", font=("Arial", 9, "italic"))
        comparison.pack(pady=(0, 5))
    def create_tab3(self):
        # IEEE754浮点数转换
        tab = self.tab3
        tab.configure(style='TFrame')
        # 标题
        title = tk.Label(tab, text="IEEE754浮点数转换", font=("Arial", 16, "bold"), bg="#f0f0f0")
        title.pack(pady=10)
        # 输入框
        input_frame = tk.Frame(tab, bg="#f0f0f0")
        input_frame.pack(pady=10)
        tk.Label(input_frame, text="16进制输入:", bg="#f0f0f0").grid(row=0, column=0, padx=5, pady=5)
        self.float_hex_input = tk.Entry(input_frame, width=40, font=("Arial", 12))
        self.float_hex_input.grid(row=0, column=1, padx=5, pady=5)
        self.float_hex_input.insert(0, "41C80000")
        # 选项区域
        options_frame = tk.Frame(tab, bg="#f0f0f0")
        options_frame.pack(pady=10)
        tk.Label(options_frame, text="类型:", bg="#f0f0f0").grid(row=0, column=0, padx=5, pady=5)
        self.float_type = ttk.Combobox(options_frame, values=["单精度浮点 (32位)", "双精度浮点 (64位)"],
                                       width=18, state="readonly")
        self.float_type.grid(row=0, column=1, padx=5, pady=5)
        self.float_type.current(0)
        tk.Label(options_frame, text="字节序:", bg="#f0f0f0").grid(row=0, column=2, padx=5, pady=5)
        self.endian_type = ttk.Combobox(options_frame, values=["大端序", "小端序"],
                                        width=8, state="readonly")
        self.endian_type.grid(row=0, column=3, padx=5, pady=5)
        self.endian_type.current(0)
        # 转换按钮
        convert_btn = tk.Button(tab, text="转换", command=self.convert_ieee754, bg="#FF9800", fg="white",
                                font=("Arial", 12, "bold"), padx=15)
        convert_btn.pack(pady=10)
        # 结果区域
        result_frame = tk.Frame(tab, bg="#e0e0e0", padx=10, pady=10, relief=tk.GROOVE, bd=2)
        result_frame.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
        tk.Label(result_frame, text="转换结果:", font=("Arial", 12, "bold"), bg="#e0e0e0").pack(anchor="w")
        self.float_result = tk.Label(result_frame, text="", font=("Arial", 14), bg="white",
                                     width=40, height=2, relief=tk.SUNKEN, padx=10, anchor="w")
        self.float_result.pack(fill=tk.X, pady=5)
        # IEEE754解释
        explanation = tk.Label(tab,
                               text="IEEE754标准: 单精度浮点(32位)=1符号位+8指数位+23尾数位 | 双精度浮点(64位)=1符号位+11指数位+52尾数位",
                               bg="#f0f0f0", fg="#666")
        explanation.pack(pady=(5, 10))
        # 示例值
        examples = tk.Label(tab,
                            text="单精度示例: 41C80000 = 25.0 | C2C80000 = -100.0 | 单精度小端序示例: 0000C842 = 100.0",
                            bg="#f0f0f0", fg="#666")
        examples.pack(pady=(0, 5))
    def convert_base(self):
        input_val = self.input_entry.get().strip()
        base = self.input_base.get()
        if not input_val:
            self.update_status("错误: 请输入数值")
            return
        try:
            # 将输入值转换为十进制
            if base == "2":
                decimal = int(input_val, 2)
            elif base == "8":
                decimal = int(input_val, 8)
            elif base == "10":
                decimal = int(input_val)
            elif base == "16":
                decimal = int(input_val, 16)
            # 转换为其他进制
            binary = bin(decimal)[2:]
            octal = oct(decimal)[2:]
            hex_val = hex(decimal)[2:].upper()
            # 显示结果
            self.result_text.config(state=tk.NORMAL)
            self.result_text.delete(1.0, tk.END)
            result = f"十进制: {decimal}\n"
            result += f"二进制: {binary}\n"
            result += f"八进制: {octal}\n"
            result += f"十六进制: {hex_val}"
            self.result_text.insert(tk.END, result)
            self.result_text.config(state=tk.DISABLED)
            self.update_status("转换成功")
        except ValueError as e:
            self.update_status(f"错误: 无效的输入 - {str(e)}")
            self.result_text.config(state=tk.NORMAL)
            self.result_text.delete(1.0, tk.END)
            self.result_text.insert(tk.END, f"错误: 无效的输入\n{str(e)}")
            self.result_text.config(state=tk.DISABLED)
    def convert_hex_to_int_big(self):
        hex_input = self.hex_input.get().strip()
        if not hex_input:
            self.update_status("错误: 请输入16进制数据")
            return
        try:
            # 移除空格并确保是8个字符(4字节)
            hex_chars = hex_input.replace(" ", "")
            if len(hex_chars) != 8:
                self.update_status("错误: 需要4字节(8个16进制字符)的数据")
                return
            # 高位在前转换为整数
            int_value = int(hex_chars, 16)
            # 显示结果
            self.int_result_big.config(text=f"十进制整数: {int_value:,}")
            self.update_status("整数转换成功(大端序)")
        except ValueError as e:
            self.update_status(f"错误: 无效的16进制输入 - {str(e)}")
            self.int_result_big.config(text=f"错误: {str(e)}")
    def convert_hex_to_int_little(self):
        hex_input = self.hex_input_little.get().strip()
        if not hex_input:
            self.update_status("错误: 请输入16进制数据")
            return
        try:
            # 移除空格并确保是8个字符(4字节)
            hex_chars = hex_input.replace(" ", "")
            if len(hex_chars) != 8:
                self.update_status("错误: 需要4字节(8个16进制字符)的数据")
                return
            # 将16进制字符串拆分为字节
            bytes_list = [hex_chars[i:i + 2] for i in range(0, 8, 2)]
            # 反转字节顺序(小端序转换为大端序)
            reversed_hex = ''.join(bytes_list[::-1])
            # 转换为整数
            int_value = int(reversed_hex, 16)
            # 显示结果
            self.int_result_little.config(text=f"十进制整数: {int_value:,}")
            self.update_status("整数转换成功(小端序)")
        except ValueError as e:
            self.update_status(f"错误: 无效的16进制输入 - {str(e)}")
            self.int_result_little.config(text=f"错误: {str(e)}")
    def convert_ieee754(self):
        hex_input = self.float_hex_input.get().strip().replace(" ", "")
        float_type = self.float_type.get()
        endian_type = self.endian_type.get()
        if not hex_input:
            self.update_status("错误: 请输入16进制数据")
            return
        try:
            # 根据选择确定字节长度
            if "单精度" in float_type:
                byte_len = 4
            else:
                byte_len = 8
            # 检查输入长度
            if len(hex_input) != byte_len * 2:
                self.update_status(f"错误: 需要 {byte_len} 字节 ({byte_len * 2} 个16进制字符) 的数据")
                return
            # 转换为字节序列
            data = bytes.fromhex(hex_input)
            # 处理字节序
            if "小端序" in endian_type:
                data = data[::-1]  # 反转字节顺序
            # 转换为浮点数
            if "单精度" in float_type:
                float_value = struct.unpack('>f', data)[0]
            else:
                float_value = struct.unpack('>d', data)[0]
            # 显示结果
            result = f"十进制浮点数: {float_value}"
            # 如果是小端序处理,显示说明
            if "小端序" in endian_type:
                result += f"\n(已从小端序转换)"
            self.float_result.config(text=result)
            self.update_status("IEEE754转换成功")
        except (ValueError, binascii.Error) as e:
            self.update_status(f"错误: 无效的16进制输入 - {str(e)}")
            self.float_result.config(text=f"错误: {str(e)}")
        except struct.error as e:
            self.update_status(f"错误: 浮点数转换失败 - {str(e)}")
            self.float_result.config(text=f"错误: {str(e)}")
if __name__ == "__main__":
    root = tk.Tk()
    style = ttk.Style()
    style.configure('TFrame', background='#f0f0f0')
    app = BaseConverterApp(root)
    root.mainloop()
成品地址:https://wwfl.lanzouw.com/iTgNZ36ihcjg

字节, 错误

doglove   

这个好,偶尔用一下四进制,但是四进制计算器很少。如果加上四进制,就更完美 了。
zhhayu   

在XP下显示不是有效的win32应用程序。
cyhcuichao   

128进制计算器有吗
lazhou   

收藏备用,谢谢!
dhhddhf   

IEEE754转换好像网上有很多html网页工具,在好几个网站见过
BrutusScipio   

怎么记忆里浮点数格式有几种
您需要登录后才可以回帖 登录 | 立即注册