最近调用同事vc写的dll,dll函数参数为(char * xxx,xxx),我在c#调用用string传入数据和stringbuiler传出数据一切都正常。
现在遇见怎么一个问题,就是在调用这个dll进行处理的时候,如果我要发255字节来处理,都是先将字节数组getstring转化为字符串。但是在发送过程中,我打断点看到有很多'/0'的转译字符,还有另外一个接收端调用这个dll来接收这个数据,就用stringbuilder收到这个字符串,但是在收端我发现,字符串中数据都已经被截断了"sjhg\0\0\0\0\0\djskjdh\00\0\0\0\0\",只有前面的""sjhg"4个字节的数据,收到就不对。是不是在收发时不能使用字符串这种类型,正确应该用什么类型呢?关键要能和vc dll的 char *能传过去,请教诸位大侠了,急!

解决方案 »

  1.   

    就是这个问题,是不是不能用string这种类型来传递数据,那是应该用什么呢,byte[]还是char[],或是其他的什么类型。我尝试把"\0"修改成自定义符,接收端收到后再还原,不知道会不会破坏数据.我接收端是用stringbuilder类型的,tostring()后,写入流,收都文件大小不对,查看就是很多空"\0",是不是字符串不能拿来传递数据啊,好像没有做到收发内容无关
      

  2.   

    就是读本地某个文件流,实例化一个filestream,然后调用bianrywrite二进制读
    filestream fs=new filestream (xxxxxxx);
    bianrywrite r=new bianrywrite(fs,system.encoding.default);
    byte[] buffer=new byte[255];
    r.read(buffer,0,255);
    string str=Encoding.default.getstring(buffer);
    然后就调用vc那个dll发函数,发现str字符串里很多终结符'\0',收到放入stringbuilder类型,发现第一个'\0'后有效数据都丢失了,急啊
      

  3.   

    换句话说c#里,\0能作为数据传送吗? string类型调用还是很方便,还是很希望使用,就是收发都是调用这个dll,发是string类型传入,收是stringbuilder传出,stringbuilder.tostring(),后bianarywrite写流到文件,不知道是不是哪里没有注意
      

  4.   

    可能是因为写文件的时候写入的定长的数据,被以0x0补足了。
    你看一下dll的说明,看看把\0删除会有什么影响,没影响的话就删除。
    也可以在C#里把方法的参数写为byte[]的,直接传递buffer,而不要再Encoding.default.getstring(),这样有时候会丢数据。