-1

私はCで構造体を持っています

    typedef struct config
{
    char terminal_id[4];
    char update_version[6];
    char sub_app[6];
    char day[6];
    char month[6];
    char year[6];
    char hours[6];
    char minutes[6];

};

C で記述された構成の配列 (上記のように) を C# の構造体に転送したいのですが、C# ソケットで受信するバイト型のデータしかありません。

4

1 に答える 1

0

あなたは構造を制御しており、それが持つフィールドの数を知っているので、文字列を「そのまま」送信するのは簡単ですが、終了'\0'文字を含めて、1 つの文字列がいつ終了し、次の文字列がいつ開始されるか (またはメッセージが終了するか) がわかるようにします。最後の文字列)。

受信側では、一度に 1 文字を読み取り、正しいフィールドに追加します。ゼロの文字 ('0'リテラル値ではありません0) を受信すると、1 つの文字列が終了し、次の文字列が始まることがわかります (または、受信した場合は構造全体)。最後の文字列)。

C# 文字列を事前に割り当てる必要がないため、これを使用できます。文字列ターミネータを送信する代わりの別の解決策は、文字列の長さを含む固定サイズの整数を最初に送信することです。

編集:受信側の C# 側の構造に文字列が固定サイズのバイト配列として含まれている場合でも、私が提案したアルゴリズムを使用できます。一度に 1 文字ずつ読み取り、たとえばstruct.buffer1[i++] = ch;. 配列がいっぱいになるか、文字列ターミネータを受け取ったら、カウンターをリセットして (i前の例では)、次の文字列の受信を開始します。文字列が受信した文字列よりも長い場合は、文字列が終わるまで文字を読み続ける必要がありますが、破棄するだけです。

私が言及したもう 1 つの解決策は、各文字列の前にその長さを追加する方が効果的かもしれませんが、最良の場合、C 側で 2 回の書き込みと C# 側で 2 回の読み取りを行うだけで済みます。バイト順を気にする必要がないようにするには、長さを固定長のテキスト フィールドとして送信します。たとえば、文字列を送信するには、"foobar"実際には 2 つの文字列" 6""foobar". 受信側では、最初に 4 文字を 1 回読み取り、文字列を整数に変換し、その値を実際の文字列の長さとして使用します。

于 2012-07-27T07:02:16.047 に答える