0

使いやすさのために、.NETソケットを使用してクライアント/サーバープログラム(使用しているシステムのモデル)を作成しています。すべてが順調に進んでおり、データはすべて送信されます。最大の問題はchar配列にあります。

私が送信しているパケットは、基本的に、構造体内のdoubleとchar配列の束です(これは、模倣しているシステムでパケットをモデル化するため、必要/必須です)。すべてのdoubleは正常に機能していますが、配列は4バイト/文字の長さである必要があるため、char配列は少し注意が必要です。

私はマーシャリングライブラリを使用して、バイトデータと4のChar配列バッファサイズを次のように処理しています。

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public char[] tmp;

また、[StructLayout(LayoutKind.Sequential、CharSet = CharSet.Ansi)]を使用して、文字が1バイトであることを確認します。最終的にクライアントプログラムを読み取るサーバーはCであり、タイプがちょうどそのように並んでいることを確認したいと思います。

とにかく、ものをテストするために使用している現在のサーバープログラムは、パケットとすべてを受信します。ただし、デバッグ目的で印刷しようとすると、char配列が計画どおりに実行されません。

私はすべてのものを次のように入れる大きな文字列を持っています:

return_str += "\nChar Array (tmp) : " + str.tmp;

そして、後の関数呼び出しでそれを印刷します。

印刷されるものは次のとおりです。

 System.Char[] .

char配列を指定したもの(IE、ABCDなど)の代わりに。

パケット値を指定する方法は、スライダーやテキストボックスなどを備えたWindowsフォームアプリを使用する方法です。前述のように、doubleはすべて値を完全に伝達しますが、これは別の問題です。

これがマーシャリングコードの問題なのか、それとも単にchar配列に欠けている問題なのかはわかりません。

本当にいくつかの助けを使うことができます

4

1 に答える 1

3

を呼び出すToString()と、表示されてchar[]いるものが正確に印刷されます。

char[]を使用して文字列に変換する必要がありますnew string(str.tmp)

byte[]文字列を読み取る場合は、代わりにを使用してから、を使用して文字列を読み取ることを検討してSystem.Encoding.Textください(ASCIIおよびさまざまなUTFバリアント用のエンコーダーがあります)。

于 2012-11-12T20:42:58.273 に答える