python 计算校验和

校验和是经常使用的,这里简单的列了一个针对按字节计算累加和的代码片段。其实,这种累加和的计算,将字节翻译为无符号整数和带符号整数,结果是一样的。

使用python计算校验和时记住做截断就可以了。 这里仅仅是作为一个代码样本,权作标记,直接上代码

'''
Created on 2014年9月4日

@author: lenovo
'''
import random

'''
实际计算校验和时,解释为无符号整数还是带符号整数,结果必然是一样的。因为基于补码方式存储,计算加法时都是按位加,然后该进位的就进位。
只是最终的结果,如果是带符号整数,最高位会被解释符号位
'''

def char_checksum(data, byteorder='little'):
    '''
    char_checksum 按字节计算校验和。每个字节被翻译为带符号整数
    @param data: 字节串
    @param byteorder: 大/小端
    '''
    length = len(data)
    checksum = 0
    for i in range(0, length):
        x = int.from_bytes(data[i:i+1], byteorder, signed=True)
        if x>0 and checksum >0:
            checksum += x
            if checksum > 0x7F: # 上溢出
                checksum = (checksum&0x7F) - 0x80 # 取补码就是对应的负数值
        elif x<0 and checksum <0:
            checksum += x
            if checksum < -0x80: # 下溢出
                checksum &= 0x7F
        else:
            checksum +=x # 正负相加,不会溢出
        #print(checksum)    

    return checksum

def uchar_checksum(data, byteorder='little'):
    '''
    char_checksum 按字节计算校验和。每个字节被翻译为无符号整数
    @param data: 字节串
    @param byteorder: 大/小端
    '''
    length = len(data)
    checksum = 0
    for i in range(0, length):
        checksum += int.from_bytes(data[i:i+1], byteorder, signed=False)
        checksum &= 0xFF # 强制截断

    return checksum

简单说明一下上面的脚本。如果是当作无符号整数来计算,则算法要简单很多,实际上都可以缩减为一句代码的事。如果是当作带符号整数来计算,则算法要复杂一下,要处理各种上溢出和下溢出的情形。正如文章开头指出的,不论使用哪种方式,最后的二进制表示都是一样的。所以一般情况下可以使用无符号整数来计算校验和,简单快速。

下面是验证使用的例子,

data1=bytes(b'\x01\x7F\xFF')
    data2=bytes([random.randrange(0,256) for i in range(0, 10000)])
    assert(uchar_checksum(data1) == 127)
    assert(char_checksum(data1) == 127)
    assert((uchar_checksum(data2)&0xFF) == (char_checksum(data2)&0xFF))
    print('OK')

上面的算法也很容易推广到两个字节或者四个字节的校验和计算

over

时间: 2024-10-24 04:42:54

python 计算校验和的相关文章

使用Python计算IP、TCP、UDP校验和

1.1 ip校验和的计算 Ip校验是针对ip头部的,即仅校验ip头部,而对于ip数据部分的校验,则交由相应的四次协议来保证, ip 头部中校验和字段为16bit. 计算原理如下: 1.把校验和字段设置为0 2.计算ip头部中所有16bit的字之和 3.将2中得到的和按位取反,得到校验和. 1.2 tcp校验和的计算原理 对于ip层协议来说,其校验和只要计算ip头即可,那相对的,对于四层协议来说,其校验和则需要计算四层头部与四层数据. tcp校验需要将ip伪首部.tcp报头.tcp数据分为16位的

Python计算斐波那契数列

利用Python计算第一个达到一百万位数的斐波那契数列各位数之和 结果为4501552 以下是我用到的代码,不是中间需要一些人工操作来加快收敛性,有兴趣读者可以写代码加快收敛 首先执行这个,可以大致确定一百万个数所在斐波那契序列的位置 i=1 j=1 k=i+j count=3 while count<4850000: i=j j=k k=i+j count+=1 result=str(k) print('k长度') k_len=len(result) print(k_len) sum=0 fo

数学之路-python计算实战(18)-机器视觉-滤波去噪(双边滤波与高斯滤波 )

高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到.高斯滤波的具体操作是:用一个模板(或称卷积.掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值. #滤波去噪 lbimg=cv2.GaussianBlur(newimg,(3,3),1.8) cv2.imshow('src',newimg) cv2.imshow('dst',lbimg) cv2.waitKey() cv2.destroyAllW

数学之路-python计算实战(16)-机器视觉-滤波去噪(邻域平均法滤波)

# -*- coding: utf-8 -*- #code:[email protected] #邻域平均法滤波,半径为2 import cv2 import numpy as np fn="test3.jpg" myimg=cv2.imread(fn) img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY) #加上椒盐噪声 param=20 #灰阶范围 w=img.shape[1] h=img.shape[0] newimg=np.array(img)

具有自动地计算校验和和格式化条形码的能力的条形码控件MSI Plessey

MSI Plessey条形码控件是在20世纪70年代由英国Plessey Company所设计的,主要使用在图书馆和零售应用中.MSI Code字符集的符号集是由数字0-9表示的条形码符号,开始符和结束符组成.在MSI字体中,使用圆括号来表示开始和结束字符.若不用IDAutomation字体工具将MSI字体作为一个条形码打印的话可能会比较困难,因为要求校验和数字计算.如果要首选一种简单易用的条形码字体并且不要求MSI Code,那么请考虑IDAutomation的Codabar Font,它不需

python计算均值方差

用Python求均值与方差,可以自己写,也可以借助于numpy,不过到底哪个快一点呢? 我做了个实验,首先生成9百万个样本: ? 1 2 3 nlist=range(0,9000000) nlist=[float(i)/1000000 for i in nlist] N=len(nlist) 第二行是为了让样本小一点,否则从1加到9百万会溢出的. 自己实现,遍历数组来求均值方差: ? 1 2 3 4 5 6 7 sum1=0.0 sum2=0.0 for i in range(N):     s

python计算auc指标

本文和大家分享的主要是python计算auc指标相关内容,一起来看看吧,希望对大家学习python有所帮助. 1.安装scikit-learn 1.1Scikit-learn 依赖 · Python (>= 2.6 or >= 3.3), · NumPy (>= 1.6.1), · SciPy (>= 0.9). 分别查看上述三个依赖的版本, python -V        结果:Python 2.7.3 python -c 'import scipy; print scipy.

Winsock 入门 计算校验和 示例

1 #include <stdio.h> 2 #include <string.h> 3 4 #define DATA_MAX_LEN 14 /* 最大数据长度 */ 5 6 struct data_sum 7 { 8 char data[DATA_MAX_LEN]; /* 数据 */ 9 unsigned short checksum; /* 校验和 */ 10 }; 11 12 unsigned short ip_checksum(unsigned short *buf, in

数学之路-python计算实战(21)-机器视觉-拉普拉斯线性滤波

拉普拉斯线性滤波,.边缘检测   Laplacian Calculates the Laplacian of an image. C++: void Laplacian(InputArray src, OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, int borderType=BORDER_DEFAULT ) Python: cv2.Laplacian(src, ddepth[, dst[, k