将C char *转换为.Net String然后转换为byte []

时间:2012-12-05 16:58:36

标签: c# .net types interop

我遇到了需要您帮助的数据转换问题。

我的项目是 C 和C#之间的InterOp C 的所有数据都是char *类型,数据本身可能是二进制的或可显示的字符,即每个字节在0x00到0xFF范围内。

我正在使用数据marshal::PtrToStringAnsichar*转换为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"

是否有人在两个方向上都有类似的经历?我尝试了很多方法,它们似乎都是编码方式。

1 个答案:

答案 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);