1

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

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

我正在使用 Datamarshal::PtrToStringAnsi将其转换char*String^in CLI code,但我发现一些字节值发生了变化。例如 C382 转换为 C32C。我想这可能是因为ANSI只能转换7-bit char,但82超出范围?谁能解释为什么以及最好的方法是什么?

基本上我想要做的是,我不需要任何编码转换,我只想将任何 char * 面值转换为字符串,例如,如果我也char *p = "ABC"想要String ^s="ABC",如果*p="C382"(表示二进制值)我也想要^s="C382"

在我的 .NET 代码中,两个子类将采用表示二进制数据或真实字符串的输入字符串,如果它是二进制的,它将转换"C382" to byte[]=0xC3 0x82;

读回数据时,C382 会以二进制数据的形式从数据库中取出,最终需要转换为char* "C382".

有没有人有类似的经验如何在两个方向上做这些?我尝试了很多方法,它们似乎都是编码方式。

4

1 回答 1

2

Marshal班级会为你做这件事。

转换时char*byte[]您需要将指针和缓冲区长度传递给托管代码。然后你可以这样做:

byte[] FromNativeArray(IntPtr nativeArray, int len)
{
    byte[] retval = new byte[len];
    Marshal.Copy(nativeArray, retval, 0, len);
    return retval;
}

而在另一个方向,没有什么可做的。如果你有一个,byte[]那么你可以简单地将它传递给你的 DLL 函数,该函数期望接收一个 char*。

C++

void ReceiveBuffer(char* arr, int len);

C#

[DllImport(...)]
static extern void ReceiveBuffer(byte[] arr, int len);
....
ReceiveBuffer(arr, arr.Length);
于 2012-12-05T17:58:38.197 回答