我遇到了需要您帮助的数据转换问题。
我的项目是 C 和C#之间的InterOp
, C 的所有数据都是char *
类型,数据本身可能是二进制的或可显示的字符,即每个字节在0x00到0xFF范围内。
我正在使用数据marshal::PtrToStringAnsi
将char*
转换为String^
中的CLI code
,但我发现某些字节值已更改。例如C382转化为C32C。我想这可能是因为ANSI
只能转换7-bit char
,但82
超出范围?任何人都可以解释为什么以及最好的方法是什么?
基本上我想做的是,我不需要任何编码转换,我只想将任何char * face值转换为字符串,例如如果char *p = "ABC"
我想要String ^s="ABC"
,如果*p="C382"
(代表二进制值),我也想要^s="C382"
。
在我的.NET代码中,两个子类将采用表示二进制数据或实际字符串的输入字符串,如果是二进制,则将转换"C382" to byte[]=0xC3 0x82;
回读数据时,C382将作为二进制数据从数据库中提取,最终需要转换为char* "C382"
。
是否有人在两个方向上都有类似的经历?我尝试了很多方法,它们似乎都是编码方式。
答案 0 :(得分:2)
Marshal
课程将为您完成此操作。
从char*
转换为byte[]
时,需要将指针和缓冲区长度传递给托管代码。然后你可以这样做:
byte[] FromNativeArray(IntPtr nativeArray, int len)
{
byte[] retval = new byte[len];
Marshal.Copy(nativeArray, retval, 0, len);
return retval;
}
在另一个方向,没有什么可做的。如果您有byte[]
,那么您可以将其传递给期望接收char *的DLL函数。
<强> C ++ 强>
void ReceiveBuffer(char* arr, int len);
<强> C#强>
[DllImport(...)]
static extern void ReceiveBuffer(byte[] arr, int len);
....
ReceiveBuffer(arr, arr.Length);