2012-12-05 84 views
1

我遇到需要您帮助的数据转换问题。将C char *转换为.Net字符串,然后转换为字节[]

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

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

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

回答

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); 
+0

感谢David.I试图Marshal.Copy我的职务之前,也有我的两个问题。 1)我想首先将IntPtr转换为字符串,因为.net超类将字符串作为输入类型,一个子类用于处理二进制数据,另一个用于处理文本字符串。 2)如果我记得正确,它似乎复制编码转换背后的scense,即IntPtr到字符串(字符串总是双字节)。 – user1821130

+0

不要使用'string'。 'Marshal.Copy'不编码。我在这里使用的重载等同于'memcpy'。只要你使用字符串,你就会迫使编码发挥作用。你明确声明你不想用编码转换数据。所以不要使用字符串,并使用'byte []'。 –

+0

再次感谢大卫。我会试一试。 – user1821130