1

SWIG をいじって、unsidned char の typemaps で立ち往生しました。C# では、次の uint ポインターが byte[] として必要になります。

//C++
uint8_t* data;
//C#
ushort[] or byte[] data;

Python の場合、どのように見えるべきかいくつかのアイデアを見つけましたが、C# の実装には問題がありませんでした。誰かが方向性を提案してもらえますか? 前もって感謝します!

解決済み:

他の質問のマークに感謝しますが、明確な PI/Invoke または DLL のインポート用である重複しているとは思いません。私はSWIGでこれを行っており、DLLのインポートとポインタとは何の関係もありません(SWIGはそれ自体で行っています)。しかし、誰かが同じ問題を抱えている場合、私はいくつかの質問を思いつきました: まず、誰かがそれを試してみたい場合は、より多くのタイプマップを調べることができます:

%include "cpointer.i"
//%pointer_cast(unsigned char*,byte, convert_to_array)

また

%include "carrays.i"
//%array_functions(unsigned char, ushort);

彼らがどのように機能するのか確信が持てなかったので、ここに私の最終的な解決策があります:SWIG用のC++コンバーターを作成しました.coz SWIGはchar*を文字列に、または文字列を適切なライブラリで文字列に変換します:

C++ 変換コード

std::string ConvertData(uint8_t &data)
{
    char* inner = (char*)malloc(sizeof(data));    
    std::string tmp ;    
    for (int i = 0; i < sizeof(data); i++)
    {
        sprintf(inner, "%02X ", data[i]);
        tmp += inner;

    return tmp;
}

最後にHEXとして使用されるため、フォーマットも必要でした。このフォーマットでは、実際のデータ バイトが大文字と空白で区切られた 2 文字に分割されます。

SWIG インターフェース ファイルを使用する場合、これを C++ ヘッダーの前に追加します。これは SWIG に std ライブラリを使用し、文字列を正しく使用するように指示します。文字列の代わりに char* を使用する他のオプションと SWIG も文字列を返します。

%include "std_string.i" 

次に、C# または任意の言語で、必要に応じて文字列を使用できます。空白があった文字列配列に解析しました。

C#

string[] tmp = ConvertData(parsedStringFromCPP).Split(' ');

希望は他の誰かにも役立ちます。乾杯

4

0 に答える 0