基本数据类型的转换 - 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"));