对一个byte[]计算出CRC码后放在一个buffer进行传输,发送的是string类型,所以先把CRC通过System.Text.Encoding.Default.GetString(buffer)转成string类型,问题是接收的常出现3F,在网上查了很久,找到说是一个字节char表示范围小于127,所以计算出来的CRC大于127时就溢出显示3F,我也尝试了以下办法,结果都无法解决,特来求遇到过此类问题的朋友指教!
我试了:
byte[] tt=null;
tt[0] = (byte)buffer[0];
tt[1] = (byte)buffer[1];
我想byte类型表示范围是0-255,但是这样写了还是不行
我还试了用System.Text.Encoding.UTF8.GetString(buffer),也是不行
我试了:
byte[] tt=null;
tt[0] = (byte)buffer[0];
tt[1] = (byte)buffer[1];
我想byte类型表示范围是0-255,但是这样写了还是不行
我还试了用System.Text.Encoding.UTF8.GetString(buffer),也是不行
可以转为16进制字符串
用BitConverter.ToString
string str = BitConverter.ToString(tt).Replace("-","");//转回byte数组
ublic byte[] Hex2ByteArr(string src)
{
int len = src.Length/2;
byte[] arr = new byte[len];
for(int i=0;i<len;i++)
{
arr[i] = Convert.ToByte(src.Substring(i*2,2),16);
}
return arr;
}
用BitConverter.ToString
byte[] tt = BitConverter.GetBytes(crc(System.Text.Encoding.Default.GetBytes(str1)));
获得CRC的字节数组,然后我转成string:
str2 = System.Text.Encoding.Default.GetString(tt);
我为了在发出去之前看转的对不对,把字节内容显示了出来:
byte[] eee = System.Text.Encoding.Default.GetBytes(str2);
for (int i = 0; i < eee.Length; i++)
{
tb_Info.AppendText(eee[i].ToString("X2")+" ");
}发现这样操作,经常就是出现3F,就是溢出
BitConverter.ToString(tt).Replace("-","");
转成16进制的字符串,其实得到的就是asc码的16进制字符串,而不是这个16进制对应的内存中代表的原来的数据了,这样的数据下位机PLC收到的也是这样的字符串,是不会识别出这个16进制字符串表示的数据的
__________________________---
费了这么大个劲就是想要个string?
str2 =ushort.ToString();//这样不就得了?
str2 =ushort.ToString();//这样不就得了?----------------------------------------我是要把ushort存为一个2字节数组,因为接收的PLC要的就是一个2字节的CRC码,你这样一个ToString()那全是ASC码
---------------------------------------------------------------------
这可难办了,C#的定义就是127的。
_____________________________________
ASC过去后再解成byte不成啊?
就算你传字符串,PLC是如何解的解的呢?如果是和写字符串对应的解法,那么我认为那本身就是错的.否则你肯定是自己转编码