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范围内

我正在使用Data
marshal::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);