news 2026/8/24 22:19:02

基于Python开发数据类型转换工具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Python开发数据类型转换工具

一、小程序功能设计

1、功能背景

(1)在嵌入式岗位的工作中,经常会涉及到数据类型转换,虽然网络上有网页端的数据类型转换工具,但部分企业可能会禁止登录外网,网络的现有资源可能无法使用。

(2)对此,可以设计程序实现离线的数据类型转换,这样,在涉及到数据类型转换的计算时,在本地即可使用数据类型转换的功能。

2、功能定义

(1)用户在输入框输入待转换的数值,小程序自动将各个类型的转换结果全部展示在下方。

(2)用户可选择以十进制或十六进制输入原始数据,如果选择十六进制,则仅支持输入整数类型数据。

(3)如果原始数据的大小超出数据类型可表示的范围,则对应数据类型的转换结果不会显示。

二、小程序开发

1、开发环境

(1)需要确认安装的Python是否自带tkinter库(图形依赖),有则无需单独安装。

(2)安装pyinstaller库,该库主要用于将.py打包成可执行文件.exe,使其运行能够脱离Python环境。

2、程序源码

import tkinter as tk from tkinter import ttk, messagebox import struct def swap_bytes(data: bytes, mode: str) -> bytes: length = len(data) if mode == "ABCD": return data elif mode == "DCBA": return data[::-1] elif mode == "BADC": lst = list(data) for i in range(0, length, 2): if i+1 < length: lst[i], lst[i+1] = lst[i+1], lst[i] return bytes(lst) elif mode == "CDAB": if length == 4: return bytes([data[2],data[3],data[0],data[1]]) elif length ==8: return bytes([data[2],data[3],data[0],data[1],data[6],data[7],data[4],data[5]]) return data return data def bytes2hexstr(b:bytes)->str: return " ".join(f"{x:02X}" for x in b) Q_SCALE = { "Q15": 1 <<15, "Q16":1<<16, "Q30":1<<30, "Q31":1<<31 } class NumConvertApp(tk.Tk): def __init__(self): super().__init__() self.title("嵌入式数字格式转换器") self.geometry("1420x840") self.resizable(True,True) self.input_mode = tk.StringVar(value="dec") self.raw_input = tk.StringVar() # 顶部输入区 top_frame = ttk.Frame(self) top_frame.pack(fill="x",padx=12,pady=8) ttk.Radiobutton(top_frame,text="十进制",variable=self.input_mode,value="dec",command=self.calc_all).grid(row=0,column=0) ttk.Radiobutton(top_frame,text="十六进制",variable=self.input_mode,value="hex",command=self.calc_all).grid(row=0,column=1,padx=12) ttk.Label(top_frame,text="输入数值:").grid(row=1,column=0,sticky="w") entry = ttk.Entry(top_frame,textvariable=self.raw_input,width=38) entry.grid(row=1,column=1,padx=6,pady=4) entry.bind("<KeyRelease>",lambda e:self.calc_all()) # 表头 header_frame = ttk.Frame(self) header_frame.pack(fill="x",padx=12) ttk.Label(header_frame,text="数据类型",width=22).grid(row=0,column=0) ttk.Label(header_frame,text="ABCD(大端序)",width=35).grid(row=0,column=1) ttk.Label(header_frame,text="DCBA(小端序)",width=35).grid(row=0,column=3) ttk.Label(header_frame,text="BADC",width=35).grid(row=0,column=5) ttk.Label(header_frame,text="CDAB",width=35).grid(row=0,column=7) self.row_widgets = [] type_list = [ ("UINT16","<H",2), ("INT16","<h",2), ("UINT32","<I",4), ("INT32","<i",4), ("FLOAT32","<f",4), ("UINT64","<Q",8), ("INT64","<q",8), ("FLOAT64","<d",8), ] for row_idx,(name,fmt,blen) in enumerate(type_list): fr = ttk.Frame(self) fr.pack(fill="x",padx=12,pady=3) ttk.Label(fr,text=f"{name}",width=18).grid(row=0,column=0) wids = {"name":name,"fmt":fmt,"blen":blen,"entries":[]} # 4组:输入框+复制按钮,隔一列摆放 col_pos = 1 for _ in range(4): e = ttk.Entry(fr,width=20) e.grid(row=0,column=col_pos,padx=2) btn = ttk.Button(fr,text="复制",command=lambda entry_widget=e:self.copy_to_clip(entry_widget)) btn.grid(row=0,column=col_pos+1,padx=2) wids["entries"].append(e) col_pos +=2 self.row_widgets.append(wids) # Q格式区域 q_frame = ttk.LabelFrame(self,text="Q定点格式(Q15/Q16/Q30/Q31)") q_frame.pack(fill="x",padx=12,pady=10) self.q_text = tk.Text(q_frame,height=6) self.q_text.pack(fill="both",expand=True,padx=4) self.calc_all() def copy_to_clip(self,entry_widget): val = entry_widget.get() self.clipboard_clear() self.clipboard_append(val) messagebox.showinfo("提示","已复制到剪贴板") def parse_input(self): s = self.raw_input.get().strip() if not s: return None try: if self.input_mode.get() == "dec": if "." in s: return float(s) else: return int(s) else: s = s.replace("0x","") return int(s,16) except Exception: return None def calc_all(self): val = self.parse_input() for rw in self.row_widgets: for e in rw["entries"]: e.delete(0,tk.END) self.q_text.delete(1.0,tk.END) if val is None: return for rw in self.row_widgets: fmt = rw["fmt"] blen = rw["blen"] try: pack_data = struct.pack(fmt,val) except Exception: continue modes = ["ABCD","DCBA","BADC","CDAB"] for i,m in enumerate(modes): swapped = swap_bytes(pack_data,m) hex_str = bytes2hexstr(swapped) rw["entries"][i].delete(0,tk.END) rw["entries"][i].insert(0,hex_str) q_out = [] for qname,scale in Q_SCALE.items(): q_int = round(val * scale) restore = q_int / scale q_out.append(f"{qname:5s}: Q定点整数={q_int},还原浮点={restore:.8f}") self.q_text.insert(tk.END,"\n".join(q_out)) if __name__ == "__main__": app = NumConvertApp() app.mainloop()

3、可执行程序生成

在程序源码文件num_format_converter_gui.py所在目录下打开终端,输入命令“pyinstaller -w -F num_format_converter_gui.py”,即可生成可执行文件num_format_converter_gui.exe

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 22:17:08

foobox:三步给 foobar2000 换上现代 DUI 皮肤

foobox&#xff1a;三步给 foobar2000 换上现代 DUI 皮肤 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 如果你还在用 foobar2000 出厂的默认界面&#xff0c;大概率觉得它停留在十几年前的样子&…

作者头像 李华
网站建设 2026/8/24 22:15:38

饥荒服务器管理变简单:新手用 dst-admin-go 五分钟跑通第一个房间

饥荒服务器管理变简单&#xff1a;新手用 dst-admin-go 五分钟跑通第一个房间 【免费下载链接】dst-admin-go Dont Starve Together server panel. Manage room with ease, featuring visual world and mod management, player log collection。饥荒联机服务器面板。轻松管理房…

作者头像 李华
网站建设 2026/8/24 22:11:25

ppInk:完全免费的Windows屏幕标注工具,10支预设笔一次配齐

ppInk&#xff1a;完全免费的Windows屏幕标注工具&#xff0c;10支预设笔一次配齐 【免费下载链接】ppInk Fork from Gink 项目地址: https://gitcode.com/gh_mirrors/pp/ppInk 你正在远程开产品会&#xff0c;讲到一半需要在共享屏幕上圈重点、画箭头&#xff0c;又不想…

作者头像 李华
网站建设 2026/8/24 22:03:00

Pcap-Analyzer 快速部署指南:从零跑通离线抓包数据分析

Pcap-Analyzer 快速部署指南&#xff1a;从零跑通离线抓包数据分析 【免费下载链接】Pcap-Analyzer Python编写的可视化的离线数据包分析器 项目地址: https://gitcode.com/gh_mirrors/pc/Pcap-Analyzer Pcap-Analyzer 是一个用 Python 编写的可视化离线数据包分析器&a…

作者头像 李华
网站建设 2026/8/24 21:59:20

leetcode 1736. Latest Time by Replacing Hidden Digits

Problem: 1736. 替换隐藏数字得到的最晚时间 匹配即可的&#xff0c;主要是hour需要特殊考虑 Code class Solution { public:string maximumTime(string time) {string ret;if(time[0] ?) {if(time[1]? || time[1] < 3) ret "2";else ret "1";…

作者头像 李华