IM提醒:QQ|MSN
IM提醒:QQ|MSN|Skype|Gtalk|Email
手机订阅
http://www.shidongliang.cn/wap
邮箱订阅
feedsky
RSS订阅
Rss首页
抓虾
Rojo
google reader
netvibes
my yahoo
newsgator
bloglines
鲜果
哪吒
有道
QQ邮箱
九点
基本数据类型的转换 - byte (原创)


由于我以前用的基本上都是些高级语言,所以很多底层的事情都让高级语言自己给做掉了,而我们根本就不知道。

 

我知道类型转换,从大的数据类型转换到小的数据类型需要强制转换(显示转换),但是今天我才知道,都是时候仅仅是显示转换还是会出错。

 

C# :

      byte  crc = 0x00;     // crc 是根据一串数据计算出来的校验和,因为 0x00 很特殊,所以它是我这个笔记的重点。

      0x100 - crc ;           //  100 - crc    是取校验和的反码。

      

      我的错误用法:  1、  (0x00-crc).ToString("X2");

                               2、Convert.ToByte(0x00-crc).ToString("X2");

                               3、((byte)(0x00-crc)).ToString("X2");

================= End Code =================================

ToString("X2");   是将 byte 类型的值以  16 进制字符串形式显示,不足两位的在前面补0;

 

以上三种写法在一般情况下都是正常的,但是当 crc 计算出来的值为 00 的时候就会出问题了。

0x00 是两个byte,crc是一个byte;0x100 - 0x00 计算出来是两个byte。短的和长的计算,向上隐式转换结果是两位。  不过不是 0x00  就不会是两个byte。

 

0x100 - 0x00     的结果当做一个byte 来用于 ToString("X2");  就出错了,转换异常。

 

注:上面的理解纯属个人看法,仅供参考。

 

解决方案:

             // 声明一个 byte 的变量,将强制转换的 byte 保持起来,然后在进行后面的计算。

             byte   crc2 = Convert.ToByte(0x00-crc);

    或者: byte    crc2 =(byte)(0x00-crc);

    然后: crc2.ToString("X2");

 

==========================================================

 

我的结论:

 

            在不能完全理解某数据类型转换的情况下,先将转换后的值用一个变量接起来,然后再计算;而不要直接在计算表达式中进行转换。

 

 例:

           write (Convert.ToByte(0x00-crc).ToString("X2"));            //   只要 crc 不等于   0x00  就不会有问题。

 

         // 如果 crc 为 0x00 , 则:

          byte   crc2 = Convert.ToByte(0x00-crc);

          write (crc2.ToString("X2"));

网址
评论
昵称:     邮箱:    网址:
标题:
内容:
        
验证码:

       

网站首页 后台管理 渝ICP备09008377号 联系站长
Copyright © 2009 - 2010 ShiDongLiang. All Rights Reserved