描述: http://ke.baidu.com/view/e9733c576c85ec3a87c2c598.html
某协议包括字段: 类型Type 一个字节; 命令字Command 一个字节; 端口号Port 2个字节; 结果Result 2个字节; 传输模式TransMode 2个字节; 上传速度RateUp 4个字节; 下载速度RateDown 4个字节;
说明: (1) 协议采用网络序 (2) 协议数据内容为内存16进制值
如下为一个简单的协议数据: 18 12 00 0a 00 00 00 01 00 03 0D 40 00 00 00 14 通过数据我们并不能直观地看出对应的参数值,所以通过程序自动实现协议解析
运行时间限制: 10 Sec 内存限制: 128 MByte 输入: 一行字符串,内容为内存16进制值,每个16进制值之间用空格隔开
样例输入: 18 12 00 0a 00 00 00 01 00 03 0D 40 00 00 00 14 样例输出:
Type=24
Command=18
Port=10
Result=0
TransMode=1
RateUp=200000
RateDown=20
*********************************************
根据以上网址中给出的解法,将思路写入下:
——》根据字符串对应各segment的顺序建立一个对象segments,内部按顺序含有从Type到RateDown的7个segment
——》从头到尾扫描输入的字符串,每个小节翻译成一个字节,存储进segments的对应位置(如“ff fe”翻译成255 254存入一个short。)
——》将segments中的各个segment的大端序调整顺序
——》将调整完顺序的各segment直接打印
**********************************************
(借鉴以上网址给出的程序思路后)程序如下:
struct protocol
{
char Type;
char Command;
short Port;
short Result;
short TransMode;
int RateUp;
int RateDown;
};
void Translate(char *str, protocol& segments);
void ChangeOrder(char *pointer, size_t length);
int Integer(char character);
void main()
{
clock_t ClockBegin = clock();
char str[] = "18 12 00 0a 00 00 00 01 00 03 0D 40 00 00 00 14";
protocol segments;
//将str字符串翻译的结果存入segments结构体
Translate(str, segments);
//调整结构体中各字段的字节顺序
ChangeOrder((char *)&(segments.Type), sizeof(segments.Type));
printf("Type=%d\n", segments.Type);
ChangeOrder((char *)&(segments.Command), sizeof(segments.Command));
printf("Command=%d\n", segments.Command);
ChangeOrder((char *)&(segments.Port), sizeof(segments.Port));
printf("Port=%d\n", segments.Port);
ChangeOrder((char *)&(segments.Result), sizeof(segments.Result));
printf("Result=%d\n", segments.Result);
ChangeOrder((char *)&(segments.TransMode), sizeof(segments.TransMode));
printf("TransMode=%d\n", segments.TransMode);
ChangeOrder((char *)&(segments.RateUp), sizeof(segments.RateUp));
printf("RateUp=%d\n", segments.RateUp);
ChangeOrder((char *)&(segments.RateDown), sizeof(segments.RateDown));
printf("RateDown=%d\n", segments.RateDown);
clock_t ClockEnd = clock();
//cout << result << endl;
cout << ClockEnd-ClockBegin << "ms" <<endl;
system("pause");
return;
}
void Translate(char *str, protocol& segments)
{
//将ASCII字符串中的内容读入segments
char *current = str;
char *write_p = (char *) &segments;
while(*current != '\0')
{
unsigned char value = 16 * Integer(*current) + Integer(*(current+1));
*write_p = value; //一个字节一个字节写入
++write_p;
current +=3;
}
}
void ChangeOrder(char *pointer, size_t length)
{
//将pointer指向的字节起始,共length个字节调整顺序
int begin = 0;
int end = length-1;
while( pointer + begin < pointer + end)
{
char temp = pointer[begin];
pointer[begin] = pointer[end];
pointer[end] = temp;
++begin;
--end;
}
}
int Integer(char character)
{
//将character(十六进制的ASCII字符:0~9,'a'~'z', 'A'~'Z')转化为整数
int result = -1;
if (character <='z' && character >='a')
{ result = 10+character-'a'; }
else if (character <='Z' && character >='A')
{ result = 10+character-'A'; }
else if (character <='9' && character >='0')
{ result = character-'0'; }
return result;
}
但有个问题是在显示结果程序结束时,有以下错误