byte[] bdata={0xEA,0x2A,0x00,0xD6,0x42,0x22,0xD7,0x54,0xF0,0x04,0x81,0x00,0xD6,0x6C,0x75,0x6A};
char[] buffer=new char[16];
buffer=Encoding.ASCII.GetChars(bdata);
我是按照上面这样做的。但是调试的时候,发现结果buffer里面的数据有的就不是对应的字符,转换后对应的十进制数如下所示
0xEA,0x2A,0x00,0xD6,0x42,0x22,0xD7,0x54,0xF0,0x04,0x81,0x00,0xD6,0x6C,0x75,0x6A
63, 42, 0,  63, 66, 34, 63, 84, 63, 4,  63, 0,  63, 108,117,106发现凡是变成63的全是错的,其他的是对的,请问正确的代码应该如何写?谁知道的麻烦告诉我。

解决方案 »

  1.   

    Encoding.ASCII  试试其他编码另外,byte[] bdata={0xEA,0x2A 这些数值是怎么来的~
    你就要用什么方式还原回去~
    比如A和B 约定0x11是 你好  A和C约定0x11 是 大家好那么当A收到0x11的时候
    必须知道是什么约定
      

  2.   

    这些数值都是从串口接收到的十六进制数据,需要转换为char[],以便于dll中的函数引用。由于那几个数据出错了,所以最后得出的结果不对。请教各位正确的应该怎么做。谢谢了。
      

  3.   

    我后来用Encoding.UTF7.GetChars(bdata),发现虽然buffer里的数值是对的,但是最后的结果相差很大。还是应该是ASCII ,但是ASCII只到128,大于128的就全变为63了,请问谁知道怎么解决这个问题啊?
      

  4.   

    两个办法:
    1. 遍历赋值 buffer[i]=(char)bdata[i]
    2. 串口取数据不要用ReadByte,可以是ReadChar、Read等都可以
      

  5.   

    谢谢楼上的,你说的第一个办法,我刚才试了,效果和Encoding.UTF7.GetChars(bdata)是一样的,行不通。
    第二个办法我觉得我读取的数据是二进制数据,应该是用ReadByte按字节读取的,用ReadChar是从缓冲区中一次读取一个字符,貌似也不行。
      

  6.   

    用Encode.GetString()转换为string,然后调用ToCharArray()。
      

  7.   

    当然如果跟互联网url无关,那么写     bdata.Select(x=> (char)x).ToArray()其实就好了。我不知道你怎么搞出来 Encoding.ASCII 呢?这就是 byte -> byte 的转换啊,跟字符无关。
      

  8.   

    byte -> char你这个就是 byte 与 char 之间的转换,如果就接到什么Encoding的字符编码,那就是绕了一个大圈。而且你把 byte 转为字符,再转回来时肯定就丢失了一些信息。实际上 byte[]转为字符串,并不能保证再转回原来的byte[]。所以整个转换过程中就不关 Encoding 字符编码的事。
      

  9.   

    大于128的肯定不是ASCII编码,不知道为何要用ASCII去解释大于128的字符编码,
      

  10.   

    Byte值0xEA转换为char后,如果希望其值仍然为0xEA,那么就如楼上所说,与编码无关。
    直接赋值就可以了:buffer[i]=(char)bdata[i]。至于ReadChar应该可以,别拘泥于字符、字节的区别,char也可以用来存放整数。