MENU

Ethernet帧的CRC校验

• 2018 年 11 月 11 日 • 阅读: 263 • 源码

//CrcEncode.cpp : 定义控制台应用程序的入口点

#include "stdafx.h"
#include "string.h"
#include "fstream"
#include "iostream"
using namespace std;

void main(int argc,char* argv[])
{
    if(argc!=2) //检查命令行参数
    {
        cout<<endl<<"请按以下格式输入命令行:CrcEncode output_file"<<endl;
        return;
    }

    fstream outfile; //创建输出文件流
    outfile.open(argv[1],ios::out|ios::binary); //打开输出文件
    for(int i=0;i<7;i++)
        outfile.put(char(0xaa)); //写入7B前导码
    outfile.put(char(0xab));

    int nCrcs=int(outfile.tellp()); //开始计算CRC位置
    char dst_addr[6]={char(0x00),char(0x00),char(0xe4),char(0x86),char(0x3a),char(0xdc);
    outfile.write(dst_addr,sizeof(dst_addr));
    char src_addr[6]={char(0x00),chat(0x00),char(0x80),char(0x1a),char(0xe6),char(0x65)};
    outfile.write(src_addr,sizeof(src_addr));

    char data[]="Hello world!";
    int length=strlen(data);
    outfile.put(chat(length\256));
    outfile.put(char(length%256));
    cout<<endl<<"长度字段:"<<hex<<length<<dec<<"("<<length<<")"<<endl;

    outfile.write(data,length);
    cout<<"数据字段:"<<data<<endl;

    int nCrc=int(outfile.tellp());
    outfile.put(char(0x00));
    int total=int(outfile.tellp())-nCrcS;
    outfile.seekg(nCrcS,ios::beg);
    unsigned char crc=0;
    while(total--)
    {
        char temp;
        outfile.get(temp);
        
        //模拟数据除以100000111的二进制除法过程
        for(unsigned char i=(unsigned char)0x80;i>0;i>>=1)
        {
            if(crc&0x80)
            {
                crc<<=1;
                if(unsigned char(temp)&i)
                    crc^=0x01;
                crc^=0x07;
            }
            else
            {
                crc<<=1;
                if(unsigned char(temp)&i
                    crc^=0x01;
            }
        }
    }

    ooutfile.seekp(nCrc,ios::beg);
    outfile.put(crc);
    cout<<"帧效验字段:"<<hex<<(int)crc<<dec<<"("<<(int)crc<<")"<<endl;
    cout<<endl<<"帧封装与CRC效验完成"<<endl;
    outfile.close();

    return;
    }
- - - The END - - -
  • 文章标题:Ethernet帧的CRC校验
  • 文章链接:https://gxusb.com/6.html
  • 版权所有:本文版权归 Get-林林小窝 所有,转载请注明出处!除特殊注明外(如有侵权,请联系 gxggxl@qq.com ),本站原创内容均采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可
  • 广告

    最后编辑于: 2018 年 12 月 06 日
    返回文章列表 文章二维码 打赏
    本页链接的二维码
    打赏二维码