【一些题】机试?ASCII字符串转换成十六进制,大端与小端

描述:  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;
}


程序运行结果如下:


但有个问题是在显示结果程序结束时,有以下错误


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值