C# 如何将char * 指向的内如取出

时间:2022-03-27 09:04:01
如:我有一个结构体,里面有一个char* 指向数据的地址,并且有一个nDataLength的变量表示数据长度

问题:我如何取出char* 中的数据到一个Byte[]中?

11 个解决方案

#1


char**相当于字符串数组。
char*相当于字符串。
你可以用string接受,并且用ToCharArray()装入数组。

#2


用string 接收后的发现这个值一直都是"",所以改为了char* ,然后想从指定的地址开始读长度的数据

#3


试试            StringBuilder

#4


引用 2 楼 yelangFeb 的回复:
用string 接收后的发现这个值一直都是"",所以改为了char* ,然后想从指定的地址开始读长度的数据


不会吧,你好好看看你的C程序吧,是不是平栈了,用string接受应该是没有任何问题的,还有,你的char*里面有数据?直接用Marshal.Copy就行了吧

#5


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、结构体也好,结构体中有指针也好,将一个结构体作为一个数组也好,其实都是数据内存分布的表现形式,不用拘泥于一一对应,可以传送并在传送后转为需要的形式即可。

#6


试试            StringBuilder 是可以的

#7


char *pData;
IntPtr data = new IntPtr(pData);
byte[] buff = new byte[nDataLength];
Marshal.Copy(data, buff, 0, nDataLength);

#8


stringbuiler 
再不行IntPtr

#9


stringbuiler 有用

#10


用stringbuilder,传入前必须声明足够的长度。
------------------
当调用Win32的DLL时,如果接口方法的参数中有字符串的输出(LPSTR),就应该使用StringBuilder这个类型,
此时,定义的StringBuilder变量就必须指定大小(为变量初始化内存空间),否则,
当DLL内部对变量空间赋值的时候会失败,甚至出现意外,因为外部DLL并不支持StringBuilder这样的数据操作行为。

#11


这个贴子真是好

#1


char**相当于字符串数组。
char*相当于字符串。
你可以用string接受,并且用ToCharArray()装入数组。

#2


用string 接收后的发现这个值一直都是"",所以改为了char* ,然后想从指定的地址开始读长度的数据

#3


试试            StringBuilder

#4


引用 2 楼 yelangFeb 的回复:
用string 接收后的发现这个值一直都是"",所以改为了char* ,然后想从指定的地址开始读长度的数据


不会吧,你好好看看你的C程序吧,是不是平栈了,用string接受应该是没有任何问题的,还有,你的char*里面有数据?直接用Marshal.Copy就行了吧

#5


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、结构体也好,结构体中有指针也好,将一个结构体作为一个数组也好,其实都是数据内存分布的表现形式,不用拘泥于一一对应,可以传送并在传送后转为需要的形式即可。

#6


试试            StringBuilder 是可以的

#7


char *pData;
IntPtr data = new IntPtr(pData);
byte[] buff = new byte[nDataLength];
Marshal.Copy(data, buff, 0, nDataLength);

#8


stringbuiler 
再不行IntPtr

#9


stringbuiler 有用

#10


用stringbuilder,传入前必须声明足够的长度。
------------------
当调用Win32的DLL时,如果接口方法的参数中有字符串的输出(LPSTR),就应该使用StringBuilder这个类型,
此时,定义的StringBuilder变量就必须指定大小(为变量初始化内存空间),否则,
当DLL内部对变量空间赋值的时候会失败,甚至出现意外,因为外部DLL并不支持StringBuilder这样的数据操作行为。

#11


这个贴子真是好