c语言接收数据校验判断逻辑怎么更加简洁?
问题描述
有一个项目需要对接收的数据进行校验,数据第二位是功能码,目前功能码有 0x02,0x03,0x04,0x06,0x08,0x09。
校验有两个条件: 一个是第二位的功能码是我们目前有的,另一个是接收的数据长度小于DEVICE_RECEIVE_DATA_MAX_LEN/8,不满足则退出。
下面是代码:
/*判断数据异常*/
if((1 == m_dwcurIndex && (0x02 != Ch && 0x03 != Ch && 0x04 != Ch && 0x06 != Ch && 0x08 != Ch && 0x09 != Ch)) || m_dwcurIndex >= DEVICE_RECEIVE_DATA_MAX_LEN/8)
{
SetRecvDataState(FALSE);
m_dwcurIndex = 0;
m_dwRecvLen = 0;
return;
}
目前的校验逻辑功能可以满足项目需要,但是如果功能码变成十几个,这样逻辑判断就会变得冗余,这个判断逻辑怎么写比较简洁?
问题分析
方案一
boolean isOk;
switch (Ch) {
case 0x02:
case 0x03:
case 0x04:
case 0x06:
case 0x08:
case 0x09:
isOk = true;
break;
default:
isOk = false;
break;
}
方案二
private int[] Chs = {0x02, 0x03, 0x04, 0x06, 0x08, 0x09};
private boolean containsCh(int Ch) {
for (int c : Chs) {
if (c == Ch) {
return true;
}
}
return false;
}
protected void initData(int Ch) {
if (!containsCh(Ch)) {
// ...
}
}