私がコードを実行しているときにコードが正常に機能するが、正常に実行されているときに不正なデータが読み込まれるという問題があります。しかし、問題が起こっている可能性があると思ったが、NetworkStream.Read()
がブロックされているはずです。また、スレッドを1000msのスリープ状態にしてテストしました。ループの最初の反復処理後にNetworkStream.Read()が正しく読み込まれない
ビットマップイメージをバッファに読み込み、イメージサイズをバイト単位で含む文字列とそれに続くキャリッジリターンと改行を読み込むことが、コードの目的です。私はこの問題が読んだ文にあると信じていますが、私は確信が持てません。次のコードは、Telnetの読み込みを含む大きなループに含まれていますが、これらのコードに問題はなく、ASCII文字列のみを読み取っているだけで、バイナリデータはありません。
List<byte> len = new List<byte>();
byte[] b = new byte[2];
while (!Encoding.ASCII.GetString(b).Equals("\r\n"))
{
len.Add(b[0]);
b[0] = b[1];
b[1] = (byte)stream.ReadByte();
}
len = len.FindAll(x => x != 0);
len.Add((byte)0);
string lenStr = Encoding.ASCII.GetString(len.ToArray());
int imageSize = int.Parse(lenStr);
byte[] imageIn = new byte[imageSize];
stream.Read(imageIn, 0, imageSize);
using (MemoryStream g = new MemoryStream(imageIn))
{
g.Position = 0;
bmp = (Bitmap)Image.FromStream(g);
}
コードで発生した実際の問題は、しかし、しかし、これが唯一の症状であってもよいし、連続した読み取りで\r\n
を認識していないようだ、それは正しく、それを最初に実行する時間の長さや画像を受信することです問題自体ではありません。
ありがとうございます!
EDIT: は、だから私は、問題を絞り込むと、それを取得するために、画像を取得するためにNetworkStream.Write()
を使用してnetworkStream.Read()
私のTelnetコールの間にいくつかの人工的な遅延に追加することによって、それを修正するために管理しなかった、しかし、このソリューションは厄介であり、私は希望まだこの問題が起こっている理由を知りたい
=!それはどのように写真に収まるのでしょうか? –
配列は実際には空ではありません - ヌルターミネーターを追加するのは、telnet経由では来ないので、 'Encoding.ASCII.GetString()'が追加されているかどうかわからないからです。それぞれの読み取り値は '\ r \ n'を読むまで1サイクルのバッファによって相殺されます。その文字列を解析して整数を取り出します。 –
.NETの文字列は、実際にはヌルターミネータを持っていません(interop用の文字列の後にnullバイト*がありますが、文字列)、それはCのことです。 .NET文字列には、長さ接頭辞が付けられます。いずれにしても、 'Read'は要求されたバイト数を*まで返します。戻り値は、実際に何バイト読み込まれたかを示します。必要なだけ正確にデータを取得するまで、呼び出しを続ける必要があります。あなたが持っている方法では、その時点でどのようなデータが管理されていても、それだけを読んだだけで、その後の読み込みはすべて予測不可能な動作になります。 – Luaan