1

あなたの助けが必要なデータ変換の問題があります。

私のプロジェクトはCと C#のInterOp間です。Cからのすべてのデータは型であり、データ自体はバイナリまたは表示可能な文字である可能性があります。つまり、各バイトは 0x00 から 0xFF の範囲にあります。char *

データを使用してinmarshal::PtrToStringAnsiに変換していますが、一部のバイト値が変更されていることがわかりました。たとえば、C382 を C32C に変換します。は しか変換できないからではないかと思いますが、範囲を超えていますか? 誰が理由と最良の方法を説明できますか?char*String^CLI codeANSI7-bit char82

基本的に私がやりたいことは、エンコーディング変換は必要ありません。たとえば、任意の char * フェイス値を文字列に変換しchar *p = "ABC"たいString ^s="ABC"だけ*p="C382"です^s="C382"

私の .NET コード内では、2 つのサブクラスがバイナリ データまたは実際の文字列を表す入力文字列を受け取ります。"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[]、char* を受け取ることを期待する DLL 関数にそれを渡すだけです。

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 に答える