精华内容
下载资源
问答
  • CheckSumMappedFile()去计算PE文件校验和,这个函数或许用得上。网上ASM实现很多,C实现不好找吧。最近因为要写个程序自动剁tcpip.sys,顺便折腾了一下PE文件校验和的计算。#endif/** RFC 1141 : Increm...

    #if 0

    http://www.sczgroup.org/windows/200701102106.txt

    在某些时候可能你并不想用imagehlp!CheckSumMappedFile()去计算PE文件校验和,

    这个函数或许用得上。网上ASM实现很多,C实现不好找吧。

    最近因为要写个程序自动剁tcpip.sys,顺便折腾了一下PE文件校验和的计算。

    #endif

    /*

    * RFC 1141 : Incremental Updating of the Internet Checksum

    * 2007-01-10 21:06 scz

    * PE首部的CheckSum是4字节的DWORD型,计算方法与IP首部校验和非常类似,其C语

    * 言实现一直不太好找,这里给一个基于IP首部校验和C实现修改后的函数。已经处

    * 理了奇偶。形参base_sum为旧的CheckSum,无论原值是否正确,不必将内存中的

    * 该字段清零再计算,如果清零,则base_sum也要赋成零再计算。

    * 2007-01-29 15:30 scz

    * 更正了一个BUG,注意sum的数据类型是64-bits的。

    */

    staticunsignedintpe_cksum

    (

    unsigned shortint*addr,

    unsigned intlen,

    unsigned longlongbase_sum

    )

    {

    unsigned intnleft   = len;

    /*

    * 这里不同,反码加一即取负,这种变态写法仅仅是为了避免一个编译警告。

    *

    * LONGLONG

    * ULONG64

    * unsigned long long

    */

    unsigned longlongsum     = ~base_sum + 1;

    unsigned shortint*w       = addr;

    unsigned shortintanswer  = 0;

    /*

    * Our algorithm is simple, using a 32 bit accumulator (sum), we add

    * sequential 16 bit words to it, and at the end, fold back all the

    * carry bits from the top 16 bits into the lower 16 bits.

    */

    while( nleft > 1 )

    {

    sum    += *w++;

    nleft  -= 2;

    }

    /*

    * mop up an odd byte, if necessary

    */

    if( 1 == nleft )

    {

    *( unsigned char* )( &answer )     = *( unsignedchar* )w ;

    sum                                += answer;

    }

    /*

    * add back carry outs from top 16 bits to low 16 bits

    *

    * add hi 16 to low 16

    */

    sum     = ( sum >> 16 ) + ( sum & 0xFFFF );

    /*

    * add carry

    */

    sum    += ( sum >> 16 );

    /*

    * truncate to 16 bits

    */

    answer  = ( unsigned short)( sum & 0xFFFF );

    /*

    * 这里不同

    *

    * add len

    */

    sum     = answer + len;

    return( ( unsignedint)sum );

    }  /* end of pe_cksum */

    (scz)

    展开全文
  • 摘 要:简述CRC算法原理,给出一种新颖快速的查表计算方法,并给出用C语言编写的算法源程序。关键词:CRC、多项式、查表法在编写数据传输程序时,数据容错是一个非常重要的问题。循环冗余位校验(Cyclicl Redundncy ...

    摘 要:简述CRC算法原理,给出一种新颖快速的查表计算方法,并给出用C语言编写的算法源程序。

    关键词:CRC、多项式、查表法

    在编写数据传输程序时,数据容错是一个非常重要的问题。循环冗余位校验(Cyclicl Redundncy Check英文简称CRC)是目前运用非常广泛的一种数据容错方法,在数据传输,数据压缩等领域运用极其广泛。CRC的实现分为硬件和软件两种方法,其中软件实现的关键在于计算速度。如果单纯模拟硬件实现方法,则计算速度较慢。笔者在编制一个数据通讯软件中,运用了一种新颖的查表法计算CRC,速度很快,效果极佳。

    首先介绍其原理,如果每次参与CRC计算的信息为一个字节,该信息字节加到16位的累加器中去时,只有累加器的高8位或低8位与信息字节相互作用(异或),相互作用(异或)的结果记为组合值,那么累加器中的新值等于组合值加上(按模2异或)累加器中未改变的那一半即为新的CRC值。

    组合值只有256种可能,因此可利用硬件模拟算法先算好它们的CRC值预先填入一张表中,该表的每一单元对应相对值的CRC。这样就可以通过查表法来计算CRC值,以便大大提高CRC运算的速度。下面给出用C语言编制的计算程序。

    首先将CRC生成多项式及CRC值表定义为一个头文件CRC.H:

    #define CRC_CCITT 0x1021 //CCITT多项式

    #define REV_CCITT 0x8408 //反转CCITT多项式

    #define CRC16 0x8005//CRC16多项式

    #define REV_CRC16 0x

    001 //反转CRC16多项式

    unsigned short crc_tble[256]; //CRC值表

    注:16位CCITT多项式(X16 +X12 +X5 +1)和16位CRC16多项式(X16 +X15 +X2+1)为两种最常用的CRC多项式。反转多项式是指在数据通讯时,信息字节先传送或接收低位字节,如重新排位影响CRC计算速度,故设反转多项式。

    造表和查表法CRC计算函数。

    #include "crc.h"

    void mk_crctble(unsigned short genpoly)

    unsigned short crc_tble[256];

    unsigned short

    ccnum=0;

    unsigned short i,j,k;

    for(i=0,k=0;i<256;i++,k++)

    i<<=8;

    for(j=8;j>0;j--)

    if((i^ccnum)&0x8000)

    ccnum=(

    ccnum<<=1)^genpoly;

    else

    ccnum<<=1;

    i<<=1;

    crc_tble[k]=

    ccnum;

    void crc_upd

    te(unsigned short d

    t

    ,unsigned short

    ccnum)

    ccnum=(

    ccnum<<=8)^crc_tble[(

    ccnum>>8)^d

    t];

    注:genpoly为CRC多项式,

    ccnum为累加器值(即为新的CRC值),d

    t

    为参与CRC计算的信息。

    展开全文
  • 累加和校验算法(CheckSum算法)

    千次阅读 2020-12-29 03:43:36
    因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作...所以今天的校验说法,比较简单,但是有效,尤其...

    因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险,想想都可怕。

    由于本人是嵌入式相关领域的,平时玩的都是单片机,当然单片机的性能千差万别,不过很多的性能都只能说是勉强够用,毕竟成本考虑。

    所以今天的校验说法,比较简单,但是有效,尤其是一些性能一般的硬件。

    说道今日主角:累加和校验算法,又名CheckSum算法。至于出处,这里就不考究了。

    这种算法的实现:

    发送方:对要数据累加,得到一个数据和,对和求反,即得到我们的校验值。然后把要发的数据和这个校验值一起发送给接收方。

    接收方:对接收的数据(包括校验和)进行累加,然后加1,如果得到0,那么说明数据没有出现传输错误。(注意,此处发送方和接收方用于保存累加结果的类型一定要一致,否则加1就无法实现溢出从而无法得到0,校验就会无效)

    还是举个例子:

    发送方:要发送0xA8,0x50,我们使用unsigned char(8位)来保存累加和,即为0xF8(0b11111000),取反得到校验和为0x07(0b00000111)。然后将这三个数据发送出去。

    接收方:如果接收正确,这三个数据的累加和就是(0b11111111),此时加1,则得到的结果为0(实际得到的应该是0b100000000,但是由于是使用unsigned char(8位)来保存累加和,所以高位被截取掉,只剩下了低八位的8个0).

    由上面的例子,我们可以知道算法的目的是:使累加和和校验值相加得到一个二进制下每一位都是1的结果,这个结果很明显很好处理,这种算法实现起来也很简单,下面给出C语言的代码示例。

    发送方:以下是如何得到校验值的代码,结果就是我们想要的校验值。

    U8 TX_CheckSum(U8 *buf, U8 len) //buf为数组,len为数组长度

    {

    U8 i, ret = 0;

    for(i=0; i

    {

    ret = *(buf );

    }

    ret = ~ret;

    return ret;

    }

    接收方:输入已包含发送发发来的校验值,如果函数返回的值如果是0,说明数据正确。

    U8 RX_CheckSum(U8 *buf, U8 len) //buf为数组,len为数组长度

    {

    U8 i, ret = 0;

    for(i=0; i

    {

    ret = *(buf );

    }

    ret = ret;

    return ret 1;

    }

    展开全文
  • 累加和校验算法 CheckSum算法因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备...

    累加和校验算法  CheckSum算法

    因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险

    今日主角:累加和校验算法,又名CheckSum算法

    这种算法的实现:

    发送方:对数据累加,得到一个数据和,对和求反,即得到我们的校验值。然后把要发的数据和这个校验值一起发送给接收方。

    接收方:对接收的数据(包括校验和)进行累加,然后加1,如果得到0,那么说明数据没有出现传输错误。(注意,此处发送方和接收方用于保存累加结果的类型一定要一致,否则加1就无法实现溢出从而无法得到0,校验就会无效)

    还是举个例子:

    发送方:要发送0xA8,0x50,我们使用unsigned char(8位)来保存累加和,即为0xF8(11111000),取反得到校验和为0x07(00000111)。然后将这三个数据发送出去。

    接收方:如果接收正确,这三个数据的累加和就是(11111111),此时加1,则得到的结果为0(实际得到的应该是100000000,但是由于是使用unsigned char(8位)来保存累加和,所以高位被截取掉,只剩下了低八位的8个0).

    由上面的例子,我们可以知道算法的目的是:使累加和和校验值相加得到一个二进制下每一位都是1的结果,这个结果很明显很好处理,这种算法实现起来也很简单,下面给出C语言的代码示例。

    发送方:以下是如何得到校验值的代码,结果就是我们想要的校验值。

    U8 TX_CheckSum(U8 *buf, U8 len) //buf为数组,len为数组长度

    {

    U8 i, ret = 0;

    for(i=0; i{

    ret += *(buf++);

    }

    ret = ~ret;

    return ret;

    }

    接收方:输入已包含发送发发来的校验值,如果函数返回的值如果是0,说明数据正确。

    U8 RX_CheckSum(U8 *buf, U8 len) //buf为数组,len为数组长度

    {

    U8 i, ret = 0;

    for(i=0; i{

    ret += *(buf++);

    }

    ret = ret;

    return ret+1;

    }

    展开全文
  • 一:原理当发送IP包时,需要计算IP报头的校验和:1、把校验和字段置为0;2、对IP头部中的每16bit进行二进制求和;3、如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个...
  • 通信中的校验方法之一:每个数据相加之后取余放在数据末尾 #include"stdio.h" #include "stdint.h" #include <string.h> typedef unsigned char uint8_t; typedef unsigned short uint16_t; typed
  • C# 异或校验算法

    2021-05-20 06:42:18
    C# 的异或校验算法 直接上代码public partial class FormCRC : Form{public FormCRC(){InitializeComponent();}private void FormCRC_Load(object sender, EventArgs e){}/// /// CRC异或校验/// /// 命令字符串/// ...
  • 海明码CRC校验C语言实现1.海明码//codebyzxf2010.4.10#include#include#include//N代表待编码数据的上限位数#defineN100intHmLength(intk);//计算海明码校验位位数voidInCode(char*data,char*c,intk,intr);//...
  • C语言实现CRC校验

    2021-05-19 18:32:26
    #include #include // 转化后的二进制最多的位数#define MAX_BIN_LENGHT 100// 输入的表达式最多的字符数#define MAX_EXP_LENGHT 100// 根据表达式得到二进制数void...// 根据两个二进制数,得到CRC校验结果void get...
  • 以前看计算机网络相关的书,每次看到IP或者UDP报头校验和时,都一瞥而过,以为相当简单,不就是16bit数据的相加吗。最近在研究《TCP/IP详解 卷1:协议》这本书,看到校验和是16bit字的二进制反码和(晕,以前都没注意...
  • 匿名用户1级2014-05-23 回答#include<stdio.h>... //sum代表校验和,loc代表每个字符在字符串A里的位置; char *p; p=str; //将被校验字符串A的地址赋值给字符指针p,用p表示位置; n=strl...
  • 校验和计算

    2021-05-17 20:42:50
    TCP的校验和是必须的,而UDP的校验和是可选的,如果UDP中校验和字段为0,表示不进行校验和计算,因此对于UDP协议数据的修改后想偷懒的话直接将校验和设为0 就可以了。 3. 32位校验和 3.1 以太帧 以太帧校验和使用的...
  • C语言:CRC校验

    2021-05-20 12:51:08
    一、CRC码CRC:Cylic Reduancy check译作汉语就是循环冗余校验码。二、XORXOR:逻辑运算符异或,不知道用符号怎么写,总之其运算法则是,不同为1,相同为0。三、用XOR代替算术运算上除法的两个例子。1、10110010000/...
  • Linux C语言实现IP/TCP的checksum校验和计算一、sendip的IP/TCP的checksum计算二、checksum的计算测试   在使用原始套接字发送/接收报文时,需要计算IP/TCP的checksum来验证报文的准确性,网上看了很多开源软件...
  • 以前看计算机网络相关的书,每次看到IP或者UDP报头校验和时,都一瞥而过,以为相当简单,不就是16bit数据的相加吗。最近在研究《TCP/IP详解 卷1:协议》这本书,看到校验和是16bit字的二进制反码和(晕,以前都没注意...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼将代码按照一定的规律组织成若干小组,分组进行奇偶校验。各组的校验结果组成一个指误字(指出错误的代码字),不仅能检测是否出错,而且在只有一位出错的情况下指出是那位...
  • CRC校验的快速算法的C语言实现CC R校验的快速算法的C语言实现颜国谷 (中原油田信息中心 4 70 ) 5 0 1摘要:c c R循环冗余校验算法,是一种在数据存储数据通讯领域中使用十分广泛的编码算法,具有强力的检错纠错...
  • (5)、重复步骤34,直到右移8次,这样整个8位数据全部进行了处理; (6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理; (7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高...
  • CRC校验的快速算法的C语言实现颜国谷 (中原油田信息中心 457001)摘要:C R C循环冗余校验算法,是一种在数据存储数据通讯领域中使用十分广泛的编码算法,具有强力的检错纠错能力,并且开销比较小。本文从CRC基本...
  • CRC校验码的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+ r)位,最后发送出去。...
  • C语言 crc64校验算法

    2021-05-22 16:23:40
    1.[代码][C/C++]代码#include static const uint64_t crc64_tab[256] = {UINT64_C(0x0000000000000000), UINT64_C(0x7ad870c830358979),UINT64_C(0xf5b0e190606b12f2), UINT64_C(0x8f689158505e9b8b),UINT64_C(0xc...
  • FCS是802.3訊框Ethernet訊框的最後一個字段. FCS is a field at the end of the frame that‘s used to store the CRC.2、FCS是由DCS与PLC发展而来,FCS不仅具备DCS与PLC的特点,而且跨出了革命性的一步。FCS是由...
  • CRC(Cyclic Redundancy Check)...用了一天时间研究了CRC的C语言实现,理解掌握了基本原理和C语言编程。结合自己的理解简单写下来。1、CRC简介CRC检验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制...
  • 生成身份证校验码(c语言

    千次阅读 2021-07-22 11:27:09
    即将各位上的数值乘上位权之对11取余,余数为1则表示该编码正确。注意:如果最后一位校验码是“X”,则代表该校验码的数值为10。 各位的权值依次是:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1 例如...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,103
精华内容 10,441
关键字:

c语言校验和

c语言 订阅