在 c# / ReadAsync 中读取二进制数据而不是读取计数中指定的所有内容

Posted

技术标签:

【中文标题】在 c# / ReadAsync 中读取二进制数据而不是读取计数中指定的所有内容【英文标题】:Reading binary data in c# / ReadAsync not reading everything specified in the count 【发布时间】:2020-10-01 11:12:26 【问题描述】:

我读了这篇博文https://jonskeet.uk/csharp/readbinary.html

FileStream 可能只是将文件的前 10 个字节读入缓冲区。 Read 方法只保证在某些数据可用(或到达流的末尾)之前阻塞

您知道是否需要对 ReadAsync 进行同样的考虑。

您还知道在哪些情况下会遇到这种情况,Read / ReadAsync 没有读取计数中指定的所有内容?

【问题讨论】:

【参考方案1】:

您还知道在哪些情况下会遇到这种情况,Read / ReadAsync 没有读取计数中指定的所有内容?

当可用数据少于指定时。


最简单的就是你打到文件结尾的地方。

正如MSDN 所说:

如果当前可用的字节数小于请求的数量,则结果值可以小于请求的字节数,或者如果已到达流的末尾,则结果值可以为 0(零)。

也很常见;从 TCP/IP 缓冲区读取时,尽管通常不会是 FileStream。还有各种其他Stream 继承类型,它们共享相同的方法。见:System.IO.Stream

【讨论】:

我想知道的是,如果程序在本地读取文件是否会遇到这种情况,例如在本地获取一批 150 mb 文件的 8192 字节?可以部分读取批次吗? 是的,它不一定是可能的,但它是可能的,因为它取决于您对 FileStream 和其他组件的实现。典型的情况可能是硬件故障或读取指令超时。 @MariangeMarcano:所以,在正常情况下,如果你读到最后,你会得到所有的字节。

以上是关于在 c# / ReadAsync 中读取二进制数据而不是读取计数中指定的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

异步读取图像文件

python读取C#写的二进制文件,byte类型unpack

在 C# 中使用 QDataStream 读取在 QT 中创建的二进制文件

C#怎样读取数据库中Image类型?在线等!!

c#二进制文件的写入和读取

c#从数据库中读取图片出现参数无效