该死的While循环
本文将列举一个使用While循环导致死循环的实例。
但凡看过一点通讯协议的人对以下的数据结构应该不会陌生:
+-----------------+
| tag_1 | +-----------------+ | len_1 | +---+-------------+ | c | tag_1.1 | + +-------------+ | o | len_1.1 | + +-------------+ | n | content_1.1| + +-------------+ | t | tag_1.2 | + +-------------+ | e | len_1.2 | + +-------------+ | n | content_1.2| + +-------------+ | t | ...... | + +-------------+ | 1 | ...... | +---+-------------+ 具体举例如下: 该数据结构在某协议的定义里面是这样的。
TAG 是 1个字节,从0~0xFF,表明某数据的类型
LEN 是 1个字节,表明该数据的总长度(包括TAG+LEN+CONTENT)
CONTENT 数据内容的长度根据LEN来确定。
其中某种TAG的内容字段,可能是包涵其他N个TAG及其内容。(N值一般没有显式定义)
对照这个图我们可以看到:
TAG1 就包涵有TAG1.1、TAG1.2 ...
那么我们程序一般会怎么写呢?
为使程序简单,我们先做一些假设:
1、TAG1已解码 2、TAG1的长度等于usLen 3、TAG1的内容从aucBuffer[0]开始 5、MsgContent记录TAG、LEN、CONTENT的偏移 6、MsgContent定义足够大不会溢出 usOffset = 0; usCount = 0; while (usOffset < usLen) ...{ /**//* 记录TAG */ MsgContent[usCount].Tag = aucBuffer[usOffset]; /**//* 记录该TAG的内容长度 */ MsgContent[usCount].Len = aucBuffer[usOffset + 1]; /**//* 记录该TAG的地址,注意此处一般不会将内容拷贝出来,到实际使用的时候在取 */ MsgContent[usCount].Content = usOffset; /**//* 解码下一个TAG的偏移 */ usOffset += aucBuffer[usOffset + 1]; /**//* 记录TAG数目 */ usCount++; } 这个程序有些什么错误呢?请看下回分解 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/progsoft/archive/2007/01/21/1488951.aspx
|
|