C# 将C字符*转换为.Net字符串,然后转换为字节[]
我有一个数据转换问题,需要您的帮助 我的项目是C# 将C字符*转换为.Net字符串,然后转换为字节[],c#,.net,types,interop,C#,.net,Types,Interop,我有一个数据转换问题,需要您的帮助 我的项目是InterOp介于C和C#之间,来自C的所有数据都是char*类型,数据本身可以是二进制或可显示字符,即每个字节都在0x00到0xFF范围内 我正在使用Datamarshal::PtrToStringAnsi将char*转换为CLI code中的String^,但我发现一些字节值已更改。例如,将C382转换为C32C。我想这可能是因为ANSI只能转换7位字符,但是82超出了范围?谁能解释一下为什么,最好的方法是什么 基本上我想做的是,我不需要任何编码
InterOp
介于C和C#之间,来自C的所有数据都是char*
类型,数据本身可以是二进制或可显示字符,即每个字节都在0x00到0xFF范围内
我正在使用Datamarshal::PtrToStringAnsi
将char*
转换为CLI code
中的String^
,但我发现一些字节值已更改。例如,将C382转换为C32C。我想这可能是因为ANSI
只能转换7位字符
,但是82
超出了范围?谁能解释一下为什么,最好的方法是什么
基本上我想做的是,我不需要任何编码转换,我只想将任何字符*面值转换为字符串,例如,如果char*p=“ABC”
我也想string^s=“ABC”
,如果*p=“C382”
(表示二进制值),我还想^s=“C382”
在我的.NET代码中,两个子类将获取表示二进制数据或实字符串的输入字符串,如果它是二进制的,则将“C382”转换为byte[]=0xC3 0x82代码>
当读回数据时,C382将作为二进制数据从数据库中提取,最终需要将其转换为char*“C382”
有没有人有类似的经验,如何在两个方向上都做到这一点?我尝试了很多方法,它们似乎都是编码方式 封送
类将为您执行此操作
从char*
转换为byte[]
时,需要将指针和缓冲区长度传递给托管代码。然后你可以这样做:
byte[] FromNativeArray(IntPtr nativeArray, int len)
{
byte[] retval = new byte[len];
Marshal.Copy(nativeArray, retval, 0, len);
return retval;
}
而在另一个方向,没什么可做的。如果您有一个字节[]
,那么只需将其传递给希望接收char*的DLL函数即可
C++
void ReceiveBuffer(char* arr, int len);
C#
谢谢大卫。我试过了。在我发帖前抄写,我有两个问题。1) 我想首先将IntPtr转换为字符串,因为.net超类将字符串作为输入类型,一个子类用于处理二进制数据,另一个子类用于处理文本字符串。2) 如果我没记错的话,它似乎在场景后面进行编码转换,即IntPtr到字符串(字符串总是双字节)。不要使用
String
<代码>封送。复制不进行编码。我在这里使用的重载相当于memcpy
。一旦你使用字符串,你将强制编码进入游戏。您明确声明不希望使用编码转换数据。所以不要使用字符串,而是使用byte[]
。再次感谢David。我要试试。它工作得很好。最后一个问题David,为什么不需要在ReceiveBuffer中从字节[]编组到字符*?显然,在C++中,我们为char *ARR分配内存,对吗?由于字节[]和char在不同堆中,p/UnjkJavaLalER会为你针数组,C++代码可以将它复制到自己的缓冲区中。C++代码所不能做的就是记住缓冲区的地址,然后再使用它。因为托管内存可能已经用完了。
[DllImport(...)]
static extern void ReceiveBuffer(byte[] arr, int len);
....
ReceiveBuffer(arr, arr.Length);