gpt4 book ai didi

c# - 多个 BinaryReader.Read() 和 BinaryReader.ReadBytes(int i) 之间的区别

转载 作者:太空狗 更新时间:2023-10-29 23:18:45 25 4
gpt4 key购买 nike

我在搜索 BinaryReader.Skip 函数时遇到了这个 feature request on msdn .他说您可以通过使用它来提供自己的 BinaryReader.Skip() 函数。

只看这段代码,我想知道他为什么选择这种方式来跳过一定数量的字节:

    for (int i = 0, i < count; i++) {
reader.ReadByte();
}

这和:

有区别吗?
reader.ReadBytes(count);

即使这只是一个小的优化,我也想理解。因为现在我不明白为什么要使用 for 循环。

public void Skip(this BinaryReader reader, int count) {
if (reader.BaseStream.CanSeek) {
reader.BaseStream.Seek(count, SeekOffset.Current);
}
else {
for (int i = 0, i < count; i++) {
reader.ReadByte();
}
}
}

最佳答案

不,没有区别。 编辑:假设流有足够的轮空

ReadByte 方法简单地转发到底层 Stream 的 ReadByte 方法。

ReadBytes 方法调用底层流的 Read 直到它读取所需的字节数。
它是这样定义的:

public virtual byte[] ReadBytes(int count) {
if (count < 0) throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
Contract.Ensures(Contract.Result<byte[]>() != null);
Contract.Ensures(Contract.Result<byte[]>().Length <= Contract.OldValue(count));
Contract.EndContractBlock();
if (m_stream==null) __Error.FileNotOpen();

byte[] result = new byte[count];

int numRead = 0;
do {
int n = m_stream.Read(result, numRead, count);
if (n == 0)
break;
numRead += n;
count -= n;
} while (count > 0);

if (numRead != result.Length) {
// Trim array. This should happen on EOF & possibly net streams.
byte[] copy = new byte[numRead];
Buffer.InternalBlockCopy(result, 0, copy, 0, numRead);
result = copy;
}

return result;
}

对于大多数流,ReadBytes 可能会更快。

关于c# - 多个 BinaryReader.Read() 和 BinaryReader.ReadBytes(int i) 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4078936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com