学者之家电子论坛--打造电子工程师共同致富的平台's Archiver

yupengfei 发表于 2009-12-24 01:15

看看错在那里

[i=s] 本帖最后由 yupengfei 于 2009-12-24 01:18 编辑 [/i]

刚完成了一个用P1302的项目样机,想把在实际中遇到的较为迷惑的问题写出来,让大家交流,今天先写一点!

P1302接收到刷卡读头发来的数据存在一个 byte a[9] 中,约定数据协议为
a[0] 为卡类型,后面8个字节为数据,现在P1302要分别对不同的卡进行处理,处理程序片断为:

public void doCard(byte a[]){
  if(a[0]==0x01){   //处理类型1的卡
  doType1(a);
  return;
        }
if(a[0]==0x02){   //处理类型2的卡
  doType2(a);
  return;
        }
if(a[0]==0x04){    //处理类型3的卡
  doType3(a);
  return;
        }
if(a[0]==0x08){  //处理类型4的卡
  doType4(a);
  return;
        }
if(a[0]==0x10){    //处理类型5的卡
  doType5(a);
  return;
        }
if(a[0]==0x20){    //处理类型6的卡
  doType6(a);
  return;
        }
if(a[0]==0x40){    //处理类型7的卡
  doType7(a);
  return;
        }
if(a[0]==0x80){   //处理类型8的卡
  doType8(a);
  return;
  }
  doErr(); //出错,异常的指令
}

以上处理程序片断,有一处是错误的,请指出

你能找出来吗?

tomsu 发表于 2009-12-24 09:50

帮你放到 code 块里。  暂时还没看出有什么问题 :([code]
public void doCard(byte a[])
{

        if (a[0] == 0x01) {                        // 处理类型1的卡
                doType1(a);

                return;

        }

        if (a[0] == 0x02) {                        // 处理类型2的卡
                doType2(a);

                return;

        }

        if (a[0] == 0x04) {                        // 处理类型3的卡
                doType3(a);

                return;

        }

        if (a[0] == 0x08) {                        // 处理类型4的卡
                doType4(a);

                return;

        }

        if (a[0] == 0x10) {                        // 处理类型5的卡
                doType5(a);

                return;

        }

        if (a[0] == 0x20) {                        // 处理类型6的卡
                doType6(a);

                return;

        }

        if (a[0] == 0x40) {                        // 处理类型7的卡
                doType7(a);

                return;

        }

        if (a[0] == 0x80) {                        // 处理类型8的卡
                doType8(a);

                return;

        }

        doErr();                                        // 出错,异常的指令
}
[/code]

yupengfei 发表于 2009-12-24 10:32

[i=s] 本帖最后由 yupengfei 于 2009-12-24 10:37 编辑 [/i]

[b]回复 [url=http://www.study-bbs.com/redirect.php?goto=findpost&pid=88438&ptid=29798]2#[/url] [i]tomsu[/i] [/b]


    对了,补充一下,这是JAVA代码!但上面的一个片断是错误的,呵呵,大家加油,再找找,这个BUG可是花了差不多半个通霄才找到的哦!等这个问题解决了,我会陆续把我遇到最精采的与大家分享!后面还很多哦!加油:victory:

涛行九天 发表于 2009-12-24 10:54

支持小鱼,大家积极参与啊

涛行九天 发表于 2009-12-24 10:54

支持小鱼,大家积极参与啊

cangdaozhilong 发表于 2009-12-24 12:00

错在类型8,
Java byte 类型的取值范围是-128~127

woshichuanqi 发表于 2009-12-24 12:00

用C 看 也没什么问题啊

toPi 发表于 2009-12-24 12:55

[b]if(a[0]==0x80){   //处理类型8的卡
  doType8(a);
  return;
  }[/b]

==操作符会自动将类型转换为整型;你应该先手动将类型转换为整型,再进行判断,以避免错误;
int value = a[0]&0xFF;
if(value == 0x80){
.....
}

tomsu 发表于 2009-12-24 13:32

主要是 JAVA 没有 无符号类型 (unsigned) 。
在使用单字节变量存放 无符号变量时 高位bit 就会被当作符号位,
所以引用这类变量时,一般要把它重新放到更大的类型里,比如:[code]int firstByte = (0x000000FF & ((int)buf[index]);[/code]上面指出的问题的关键是常量 0x80 会被当作int型数据,也就是数值就是 0x80;
而byte里存放的数据高位bit会被当作符号位。

wangshaowei 发表于 2009-12-24 14:35

呵呵,还有这种问题,没想过

卧虎 发表于 2009-12-24 14:45

有点意思

tomsu 发表于 2009-12-24 14:53

[b]回复 [url=http://study-bbs.com/redirect.php?goto=findpost&pid=88484&ptid=29798]9#[/url] [i]tomsu[/i] [/b]


    或者这么写,也可以
[code]        if (a[0] == (byte)0x80) {                        // 处理类型8的卡[/code]

cangdaozhilong 发表于 2009-12-24 15:10

道兄的这行代码写的好啊,
即简洁又明了

yupengfei 发表于 2009-12-24 15:16

对的,看来人多就是力量大!

所以也给大家一个建议,在高层的应用时,最好用文本来表达数据,这也就是为什么XML这么流行的原因,象上述这么隐藏的BUG,初看起来没有什么问题,特别是在单片机中写程序是完全正确!

max 发表于 2009-12-24 15:28

C也是一样的。 关系到编译器的一个选项 char = unsigned char? 比如ADS1.2里面就有这样的选项

高茂光 发表于 2010-1-9 17:36

还是人多力量大啊

mingfeng 发表于 2010-1-16 15:01

学习了,不会JAVA

menfolk_odon 发表于 2010-1-17 00:15

学习学习:)

转悠 发表于 2010-1-17 12:10

新人来顶一下技术贴。

chuangyi 发表于 2010-1-23 14:59

小鱼的代码写得蛮规范的。
一般代码写得规范的,可以避免很多逻辑错误。

不过这种数据类型的错误,就是经常出问题的陷阱了。
我也同意tomsu 的看法,强制类型转化,清晰明了不出错

页: [1] 2

Powered by Discuz! Archiver 7.1  © 2001-2009 Comsenz Inc.

302 Found

302 Found


nginx/1.8.0