有这样一条需求:计算某个文件中的数组每一行元素的最后一个参数,异或输出。
因为元素比较多,十几行,通过人工去计算异或值非常困难。
而在线异或的计算器,也需要人为输入这些数值,每次计算一个最终结果需要花费2-3分钟手动输入,手酸。
于是想做一个异或工具,实现这个功能。
异或工具:
1.从文件读取每行,找到最后一个参数
2.把这些参数进行异或
3.异或的结果以16进制输出到弹窗
import fnmatch
import os
from tkinter import messagebox
"""
本异或工具功能:计算文件里数组里面每行最后一个值的异或值
计算完所有的异或值之后就输出结果
"""
"""
定义一个cal_XOR_value方法:
找到文件里所有目标值
传入参数:文件名
读取文件每行内容,contents接收返回结果
对contents的值content切片,取倒数第二个值转换为字符串
对该字符串切片,匹配开头为0x的字符
取到了第一个值,就把该值和初始值为0的变量result进行异或,结果存入result里
下一次取到值,就用该值和result异或,直到所有值都计算完毕,返回result
接收到返回结果之后追加到列表result_list中,然后继续遍历下个文件
所有文件的异或值计算好之后,弹窗输出
"""
def cal_XOR_value(file):
#result用来存放异或结果,一个数异或0等于它本身,所以result初始值为0
result=0
#打开传入的文件
with open(file,mode="r")as f :
#逐行读取该文件的内容(题目要求每行元素)
contents=f.readlines()
#遍历每行元素
for content in contents:
#以空格分割切片,取倒数第二个值
#根据文件的实际情况就是该值,文件格式不会变,所以我这里写死了
value="".join(content.split(" ")[-2:-1])
#如果取到的值是0x开头的,就把它转为int型,与result异或
if value[0:2]=="0x":
#把0x开头的十六进制字符串转化为10进制
val=int(value,16)
result^=val
#一个文件的所有值都异或完毕之后,返回以16进制字符串形式的结果result
return hex(result)
#列表存放多个文件的结果,1个文件1个结果
result_list=[]
#找到当前目录所有.c结尾的文件
for root,dirs,files in os.walk("./"):
for file in files:
file_name=os.path.join(root,file)
if fnmatch.fnmatch(file_name,"*.c"):
#调用计算异或的方法,计算出当前文件的异或结果,追加到result_list中
result_list.append(cal_XOR_value(file_name))
#所有符合要求的文件都计算出异或值之后,弹窗展示。
#其中英文字母都转换为大写,此处为了方便查看,我还在每个值的后面加了几个空格
messagebox.showinfo(title="异或值输出",message=[result.upper()+" " for result in result_list])
参考文件:(有做过改动,仅供参考)
#include <cs.h>
#define cs asdfsf((section("fsfwfwge")))
CS csa[] cs =
{
{ "aaa", 0x0, 0x29, 0, 0x2AE590E7 },
{ "bbb", 0xA052A3E8, 0x0, sfa, 0x0 },
{ "ccc", 0xA00C2C00, 0x467000, sfa | sfw, 0x2CC653CC },
{ "ddd", 0x98A00000, 0x4000000,sfa | sfw, 0xB2EB30ED },
{ "eeeeee", 0xB6A00000, 0x4000000, sfa | sfw, 0xB2EB30ED },
{ "ffff", 0xD6A00000, 0x4000000, sfa | sfaw, 0xB2EB30ED },
{ ".gg", 0x0, 0x2A, 0, 0xC1CA9762 },
{ "h", 0x70111990, 0x18C0, sss | fsafa, 0x6DA15559 },
{ "iiii", 0xA0529C14, 0x2D8, fsew | fsdse, 0xCB4C253C },
{ "j", 0x0, 0x4831, 0, 0xEF0A5918 },
{ "kkkkkkkk", 0x0, 0xC8, 0, 0xCF02F9B4 },
{ "l", 0x0, 0x7BA8, 0, 0xDA630629 },
{ "pppp", 0x0, 0xF8D3, 0, 0xC3CD60A1 },
{ "qqqqq", 0xA0529EEC, 0x40, sfwef | fewfwef, 0xB7601B },
{ "rrrrrr", 0xA0539878, 0xB45B, fwefwef, 0xE7AB0B66 },
{ "sssssssss", 0xA052A3E8, 0x7E10, wfewefw, 0xC4D809E8 },
{ "t", 0xA05321F8, 0x3770, fwefwe, 0x524D9845 },
{ "uuu", 0xA0529F2C, 0x4BC, fwewfw | fefwe, 0x75DEC15A },
{ "vvvv", 0xA0535968, 0x3F10, fegfr, 0xBF053B26 },
{ "ww", 0xA0529C00, 0x13, rettt, 0x24A10D1C },
{ "xxxxxxxxxx", 0xA0082BB8, 0x40000, regwa, 0xE20EEA22 },
{ "yyyyyy", 0xA007A1E0, 0x89D8, grere, 0x5A1F84AA },
{ "zzzzzzzzz", 0x0, 0x1A8, 0, 0xBD310E5 },
{ "a1", 0x701118A8, 0xE4, grergers | gewrgr, 0xF0BEF674 },
{ "b1", 0x0, 0x1146F, 0, 0x7AAA5662 },
{ "c1111", 0x0, 0x15450, 0, 0xF70B0C94 },
{ "d22", 0xA0000000, 0x7A1E0, gergdr | gegss, 0xAD0AD88E },
{ "ffff233", 0x70110000, 0xF04, fweefgre | egwsdxw, 0x6C170AB3 },
};
unsigned int cszc = sizeof(csa) / sizeof(cs);