Python脚本实例-计算bin文件校验值(附源码)

一、目标

用一个脚本来实现计算特定bin文件的累加和异或值CRC16CRC32值。

二、源码

import os
import struct
import zlib


def crc16_direct(bytestr):
    '''
    crc16直接计算法
    :param bytestr: bytes字符串
    :return: int16类型
    '''
    crc = 0
    if len(bytestr) == 0:
        return 0
    for i in range(len(bytestr)):
        R = bytestr[i]
        for j in range(8):
            if R > 127:
                k = 1
            else:
                k = 0

            R = (R << 1) & 0xff
            if crc > 0x7fff:
                m = 1
            else:
                m = 0

            if k + m == 1:
                k = 1
            else:
                k = 0

            crc = (crc << 1) & 0xffff
            if k == 1:
                crc ^= 0x1021  # 多项式为 0x1021
    return crc

if __name__ == '__main__':
    # t_path = os.path.abspath('.')   #当前绝对路径
    # t_path = os.path.join(t_path,'bin') #添加路径
    # print(t_path)
    dirs = os.listdir('.')  #列出当前目录列表
    cnt = 0
    for i in dirs:
        # f_path = os.path.join(t_path,i)
        if os.path.isfile(i) and os.path.splitext(i)[1] == '.bin':   #是否为文件  分离文件名与扩展名
            file = i
            cnt += 1
    if cnt == 0:
        print("未发现bin文件,请将需要计算的Bin文件放在当前文件夹")
    elif cnt > 1:
        print("存在多个bin文件,无法计算。请保证当前目录下只有一个Bin文件")
    elif cnt == 1:
        # file = "test.bin"
        in_data = input("请输入要计算的类型:\r\n1、累加和\r\n2、异或\r\n3、CRC16\r\n4、CRC32\r\n")
        with open(file,"rb") as f:
            size = os.path.getsize(file)

            if 1 == int(in_data):
                sum = 0
                for i in range(size):
                    b_data = f.read(1)  # 读文件的一个字节,但是读出来的是十六进制
                    data = struct.unpack('B', b_data)  # B的函数是将C的uchar 类型转换为python中的integer类型
                    sum += data[0]  # 为tuple类型,所以用[0]将数字取出

                sum = sum & 0xffff
                print("累加和结果:0x%.4x (%d)" %(sum,sum))

            elif 2 == int(in_data):
                xor = 0
                for i in range(size):
                    b_data = f.read(1)  # 读文件的一个字节,但是读出来的是十六进制
                    data = struct.unpack('B', b_data)  # B的函数是将C的uchar 类型转换为python中的integer类型
                    xor ^= data[0]  # 为tuple类型,所以用[0]将数字取出

                xor = xor & 0xff
                print("异或值:0x%.2x (%d)" %(xor,xor))

            elif 3 == int(in_data):
                crc16_value = crc16_direct(f.read(size))
                print(f"CRC16值:0x{hex(crc16_value)} {crc16_value}")

            elif 4 == int(in_data):
                res = 0
                res = zlib.crc32(f.read(size), res) #bytes类型内容,res初始值

                print("CRC32值:0x%.8x (%d)" %(res,res))

            else:
                print("未知类型!!!")

input("请输入任意字符结束")

三、结果

通过输入1-4来选择不同的计算结果。最终的计算结果与网络上的工具计算结果相同。

工具计算结果

累加和算法结果

异或结果

CRC16结果

CRC32结果

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个Python数据预处理的代码实例。 假设我们有一个包含学生成绩的数据集,文件名为"grades.csv",数据格式如下: ``` Name,Math,English,Science Alice,90,85,92 Bob,80,75,88 Charlie,75,92,82 David,92,87,90 ``` 我们需要进行以下数据预处理操作: 1. 将文件读取为一个Pandas DataFrame。 2. 检查是否有缺失。 3. 将每个科目的分数转换为百分制。 4. 计算每个学生的平均分。 5. 将每个学生的平均分按照从高到低排序。 6. 将处理后的数据保存为一个新文件。 下面是相应的代码实现: ```python import pandas as pd # 读取数据 df = pd.read_csv("grades.csv") # 检查是否有缺失 if df.isnull().values.any(): print("Warning: There are missing values in the data.") # 将每个科目的分数转换为百分制 df["Math"] = df["Math"] / 100.0 * 100 df["English"] = df["English"] / 100.0 * 100 df["Science"] = df["Science"] / 100.0 * 100 # 计算每个学生的平均分 df["Average"] = df.mean(axis=1) # 将每个学生的平均分按照从高到低排序 df = df.sort_values(by=["Average"], ascending=False) # 保存处理后的数据为一个新文件 df.to_csv("processed_grades.csv", index=False) ``` 执行完上述代码后,将生成一个新的文件"processed_grades.csv",内容如下: ``` Name,Math,English,Science,Average David,92.0,87.0,90.0,89.66666666666667 Alice,90.0,85.0,92.0,89.0 Charlie,75.0,92.0,82.0,83.0 Bob,80.0,75.0,88.0,81.0 ``` 以上就是一个简单的Python数据预处理代码实例

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值