2

クライアントであるこのc#プログラムは、サーバーからファイルを受信します。時にはそれはシームレスに機能します。で例外が発生することもありますfileName = Encoding.ASCII.GetString(dataByte, 4, fileNameLen);

ArgumentOutOfRange Exception
Index and count must refer to a location within the buffer.
Parameter name: bytes

の値fileNameLen8またはの場合、12適切に機能します。それ以外の場合は になります1330795077。何故ですか?誰かが私にこれがなぜなのか説明できますか? お願いします。これが私のコードです。

        string fileName = string.Empty;
        int thisRead = 0;
        int blockSize = 1024;
        Byte[] dataByte = new Byte[blockSize];
        lock (this)
        {
            string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)+"\\";
            ns.Read(dataByte, thisRead, blockSize);
            int fileNameLen = BitConverter.ToInt32(dataByte, 0);

            fileName = Encoding.ASCII.GetString(dataByte, 4, fileNameLen);
            Stream fileStream = File.OpenWrite(folderPath + fileName);
            fileStream.Write(dataByte, 4 + fileNameLen, (1024 - (4 + fileNameLen)));
            while (true)
            {
                thisRead = ns.Read(dataByte, 0, blockSize);
                fileStream.Write(dataByte, 0, thisRead);
                if (thisRead == 0)
                    break;
            }
            fileStream.Close();
        }
4

3 に答える 3

3

index と count は有効な範囲をバイト単位で表していません。

Encoding.ASCII.GetString()

ArgumentOutOfRangeException は、次の理由でスローされます。

  • インデックスまたはカウントがゼロ未満です。

  • index と count は有効な範囲をバイト単位で表していません。

カウントはあなたの場合です:fileNameLen

ドキュメントには次のように記載されています。

ストリームから読み取られたデータなど、変換されるデータは、順次ブロックでのみ使用できます。この場合、またはデータ量が大きすぎて小さなブロックに分割する必要がある場合、アプリケーションは、GetDecoder メソッドまたは GetEncoder メソッドによってそれぞれ提供されるDecoderまたは Encoder を使用する必要があります。

ドキュメントを見る

于 2013-03-22T11:20:34.680 に答える
2

dataByte転送されたときの内容を確認する必要があります。から整数を作成しようとして、dataByteこれをInt32に変換すると、次のfileNameLenようなばかげた値を受け取る可能性があります。1330795077これは、への有効なインデックスではありません。Encoding.ASCII.GetString(dataByte, 4, fileNameLen);

于 2013-03-22T11:22:15.423 に答える
0

コード内ns.Read(dataByte, thisRead, blockSize);の int 値は、読み取った実際の長さを示します。その戻り値を使用して、文字列に変換するバイト数を制御し、愚かな値を作成しないようにします。

于 2013-03-22T11:28:15.120 に答える