问题描述
如:我有一个结构体,里面有一个char*指向数据的地址,并且有一个nDataLength的变量表示数据长度问题:我如何取出char*中的数据到一个Byte[]中?
解决方案
解决方案二:
char**相当于字符串数组。char*相当于字符串。你可以用string接受,并且用ToCharArray()装入数组。
解决方案三:
用string接收后的发现这个值一直都是"",所以改为了char*,然后想从指定的地址开始读长度的数据
解决方案四:
试试StringBuilder
解决方案五:
引用2楼yelangFeb的回复:
用string接收后的发现这个值一直都是"",所以改为了char*,然后想从指定的地址开始读长度的数据
不会吧,你好好看看你的C程序吧,是不是平栈了,用string接受应该是没有任何问题的,还有,你的char*里面有数据?直接用Marshal.Copy就行了吧
解决方案六:
1、c/c++中的char不同于c#中的char;2、办法一,循环赋值,根据数据长度循环将指针数据赋值到byte[]各元素;3、办法二,将char*强制转换为IntPtr,使用Marshal.Copy将IntPtr指向的数据拷贝到byte[];4、办法三,如果是从c编写的api中获取数据,并且api参数为一个指针,dll向指针写入数据,那么可以尝试直接使用固定后的byte[]作为参数传入api,或者获取byte[]的fixed指针作为参数传入api,使dll直接将数据写入byte[],省掉一次拷贝。5、结构体也好,结构体中有指针也好,将一个结构体作为一个数组也好,其实都是数据内存分布的表现形式,不用拘泥于一一对应,可以传送并在传送后转为需要的形式即可。
解决方案七:
试试StringBuilder是可以的
解决方案八:
char*pData;IntPtrdata=newIntPtr(pData);byte[]buff=newbyte[nDataLength];Marshal.Copy(data,buff,0,nDataLength);
解决方案九:
stringbuiler再不行IntPtr
解决方案十:
stringbuiler有用
解决方案十一:
用stringbuilder,传入前必须声明足够的长度。------------------当调用Win32的DLL时,如果接口方法的参数中有字符串的输出(LPSTR),就应该使用StringBuilder这个类型,此时,定义的StringBuilder变量就必须指定大小(为变量初始化内存空间),否则,当DLL内部对变量空间赋值的时候会失败,甚至出现意外,因为外部DLL并不支持StringBuilder这样的数据操作行为。
解决方案十二:
这个贴子真是好