c# 调用vc char *

kzli 2009-12-14 08:32:23
最近调用同事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 *能传过去,请教诸位大侠了,急!
...全文
146 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
soaringbird 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kzli_7 的回复:]
换句话说c#里,\0能作为数据传送吗? string类型调用还是很方便,还是很希望使用,就是收发都是调用这个dll,发是string类型传入,收是stringbuilder传出,stringbuilder.tostring(),后bianarywrite写流到文件,不知道是不是哪里没有注意
[/Quote]
当然可以传送\0,关键是看接收方如何处理
soaringbird 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kzli_7 的回复:]
就是读本地某个文件流,实例化一个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'后有效数据都丢失了,急啊

[/Quote]
可能是因为写文件的时候写入的定长的数据,被以0x0补足了。
你看一下dll的说明,看看把\0删除会有什么影响,没影响的话就删除。
也可以在C#里把方法的参数写为byte[]的,直接传递buffer,而不要再Encoding.default.getstring(),这样有时候会丢数据。
kzli 2009-12-14
  • 打赏
  • 举报
回复
换句话说c#里,\0能作为数据传送吗? string类型调用还是很方便,还是很希望使用,就是收发都是调用这个dll,发是string类型传入,收是stringbuilder传出,stringbuilder.tostring(),后bianarywrite写流到文件,不知道是不是哪里没有注意
沐浴-vip 2009-12-14
  • 打赏
  • 举报
回复
不懂,学习下~!
kzli 2009-12-14
  • 打赏
  • 举报
回复
就是读本地某个文件流,实例化一个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'后有效数据都丢失了,急啊
soaringbird 2009-12-14
  • 打赏
  • 举报
回复
发送时的带\0的字符串你是怎么得到的?
kzli 2009-12-14
  • 打赏
  • 举报
回复
就是这个问题,是不是不能用string这种类型来传递数据,那是应该用什么呢,byte[]还是char[],或是其他的什么类型。我尝试把"\0"修改成自定义符,接收端收到后再还原,不知道会不会破坏数据.我接收端是用stringbuilder类型的,tostring()后,写入流,收都文件大小不对,查看就是很多空"\0",是不是字符串不能拿来传递数据啊,好像没有做到收发内容无关
真相重于对错 2009-12-14
  • 打赏
  • 举报
回复
c 认为\0是字符串的结束

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧