⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 framereader.cpp

📁 是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型。通过全老师耐心的讲解
💻 CPP
字号:
#include <fstream.h>
#include <stdio.h>
#include <malloc.h>
#include <CTYPE.h>
#include <conio.h>

#define String char* 
typedef unsigned char BYTE;
// 结构体,读取到的帧原始数据
typedef struct{
	char content[1500+18];  // 各字节数据
	int length;      // 实际长度
}OriginalData;


// 分析后的数据帧结构
typedef struct{
	String DestMac;
	String SourceMac;
	int FrameType;
	char Data[1500];
	int length;
	long CRC;
	void display(){
		printf("目的MAC地址:%s\n", DestMac);
		printf("源发MAC地址:%s\n", SourceMac);
		printf("帧类型:%04x\n", FrameType);
		printf("数据长度:%d\n", length);
		printf("CRC:%08x\n", CRC);
		printf("数据:\n");
		char *pChar = Data;
		for ( int j=0; j<length; j++, pChar++ )
				printf( "%c", isprint( *pChar ) ? *pChar : '.' );
	}
}FrameData;

// 从原始数据帧中获取目的MAC地址
String getDestMac(OriginalData od){
	char *d = (char *)malloc(sizeof(char) * 18);
	int start=0, length=6;
	char *fc;
	for(int i=0; i<length; i++){
		fc = i==0?"%02x":"-%02x";  // 格式字符串
		sprintf(d+i*3-(i==0?0:1), fc, *(BYTE *)(od.content + start + i));
	}
	d[18] = 0;
	return d;
}

// 从原始数据帧中获取源MAC地址
String getSourceMac(OriginalData od){
	char *d = (char *)malloc(sizeof(char) * 18);
	int start=6, length=6;
	char *fc;
	for(int i=0; i<length; i++){
		fc = i==0?"%02x":"-%02x";
		sprintf(d+i*3-(i==0?0:1), fc, *(BYTE *)(od.content + start + i));
	}
	d[18] = 0;
	return d;
}

// 从原始数据帧中获取帧类型
int getFrameType(OriginalData od){
	int start=12, length=2;
	int result = 0;
	result = *(od.content + start) * 256 + *(od.content + start + 1);
	return result;
}

// 从原始数据帧中获取数据段 返回数据段实际长度
int getData(OriginalData od, char *d){
	int start=14, length = od.length - 4 - 14;
	for(int i=0; i<length; i++){
		d[i] = od.content[start + i];
	}
	return length;
}

// 从原始数据帧中获取CRC
long getCRC(OriginalData od){
	int start=od.length-4, length=4;
	int result=0;
	result = *(od.content + start) * 256 * 256 * 256
		   + *(od.content + start + 1) * 256 * 256
		   + *(od.content + start + 2) * 256 
		   + *(od.content + start + 3) ;
	return result;
}

// 根据原始数据帧,调用上面各函数,生成分析后的数据帧结构 
FrameData* getFrameData(OriginalData od){
	FrameData *fd = new FrameData();
	fd->DestMac = getDestMac(od);
	fd->SourceMac = getSourceMac(od);
	fd->FrameType = getFrameType(od);
	fd->length = getData(od, fd->Data);
	fd->CRC = getCRC(od);
	return fd;

}

void main(char *args[]){
    char *filename = "data.dat";
	OriginalData od;
	// 从文件中读取帧数据 
	ifstream fin(filename, ios::binary);  
	char c;
	int length = 0;
	while(!fin.eof()){
        fin.read(&c, 1);
        od.content[length ++] = c;
	}
	od.length = length - 1; // 帧的实际长度 
	fin.close();
    
	// 生成分析后的数据帧结构体 
	FrameData *fd = getFrameData(od);
	fd->display();

	getch();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -