在工作中遇到需要将两个16位的有符号整数转换为32位有符号整数的功能,具体情况是需要把PLC里放在两个D软元件里的32位数据以16位为单位读到PC端后再转换为32位数据。经过实践,方法和注意事项整理如下:
先列出可用方法供大家参考,如有错误请指正!
第一种、通过BitConverter下的GetBytes()和ToInt32()方法来实现:
byte[] arrl, arrh, arrInt32;
arrInt32 = new byte[4];
arrl = BitConverter.GetBytes(deviceValue_16[i]);
arrh = BitConverter.GetBytes(deviceValue_16[i + 1]);
arrInt32[0] = arrl[0];
arrInt32[1] = arrl[1];
arrInt32[2] = arrh[0];
arrInt32[3] = arrh[1];
int32Arr[j] = BitConverter.ToInt32(arrInt32, 0);
第二种、通过位操作来实现:
int dest;
short SourceA,SourceB;//A代表低位,B代表高位
dest |= (SourceB & 0x0000ffff);
dest = (dest << 16) | (SourceA & 0x0000ffff);
在网上看到过相关功能的其他实现方法,比如:
第一种:test[j] = (arrDeivceValue[i + 1] << 16) + arrDeivceValue[i];
第二种:test[j] = arrDeivceValue[i + 1] * 65536 + arrDeivceValue[i];
这两种其实是一样的原理,但是会有问题。问题表现为:当处理数据为负数并且低16位数据的符号位为1时会得出错误的结果,当低16位数据的符号位不为1时结果是正确的。
原因我认为是这两种方法用的是加法运算导致的。因为把两个数看成独立的,那么低16位数据的符号位根据值的不同可能为1可能为0,这样进行加法运算时,若为低位为负数则结果变小,若低位为正数则结果变大。