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

如果值为fileNameLenis 8or 12then 它可以正常工作。否则会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 不表示以字节为单位的有效范围。

编码.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 回答