gpt4 book ai didi

c# - 访问 BinaryReader 的内部缓冲区

转载 作者:太空宇宙 更新时间:2023-11-03 21:26:34 26 4
gpt4 key购买 nike

我正在继承 BinaryReader 类。

我必须覆盖一些基本方法,例如 ReadUInt16 .

该方法的内部实现是:

public virtual ushort ReadUInt16(){
FillBuffer(2);
return (ushort)(m_buffer[0] | m_buffer[1] << 8);
}

我正在读取的二进制文件被组织为高字节优先(大端),并且我继承自 BinaryReader 也是因为我必须添加一些更多的功能。无论如何,我想在子类本身中实现交换。

是否有另一种方法来访问 m_buffer 或不使用反射或其他消耗资源的替代方法?
也许我应该覆盖 FillBuffer 并备份偷看的字节?或者也许只是忽略它?会不会有副作用?有没有人遇到过这个?谁能解释为什么 FillBuffer 不是内部的?是否需要始终填充缓冲区或可以跳过?既然它不是内部的,为什么不一起实现 m_buffer 字段的 protected getter?

下面是FillBuffer的实现。

protected virtual void FillBuffer(int numBytes) {
if (m_buffer != null && (numBytes < 0 || numBytes > m_buffer.Length)) {
throw new ArgumentOutOfRangeException("numBytes",
Environment
.GetResourceString("ArgumentOutOfRange_BinaryReaderFillBuffer"));
}
int bytesRead=0;
int n = 0;

if (m_stream==null) __Error.FileNotOpen();

// Need to find a good threshold for calling ReadByte() repeatedly
// vs. calling Read(byte[], int, int) for both buffered & unbuffered
// streams.
if (numBytes==1) {
n = m_stream.ReadByte();
if (n==-1)
__Error.EndOfFile();
m_buffer[0] = (byte)n;
return;
}

do {
n = m_stream.Read(m_buffer, bytesRead, numBytes-bytesRead);
if (n==0) {
__Error.EndOfFile();
}
bytesRead+=n;
} while (bytesRead<numBytes);
}

最佳答案

尝试访问内部缓冲区不是一个好主意。为什么不做这样的事情:

var val = base.ReadUInt16();
return (ushort)((val << 8) | ((val >> 8) & 0xFF));

比直接从缓冲区读取稍慢,但我严重怀疑这会对应用程序的整体速度产生重大影响。

FillBuffer 显然是一个实现细节,出于某种原因,Framework 团队决定他们需要制作 protected,可能是因为其他一些 Framework 类利用了内部工作原理二进制阅读器。因为您知道它所做的只是填充内部缓冲区,而您的派生类无权访问内部缓冲区,所以如果您决定自己重写读取实现,我建议您忽略该方法。调用它对你没有任何好处,而且可能对你造成很大的伤害。

您可能对 series of articles 感兴趣几年前写过,实现了一个BinaryReaderWriter类,本质上是BinaryReaderBinaryWriter拼接而成,可以随意读取/对底层流的写入权限。

关于c# - 访问 BinaryReader 的内部缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26643999/

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