【发布时间】:2014-10-30 02:24:34
【问题描述】:
我继承了BinaryReader 类。
我必须重写一些基本方法,例如 ReadUInt16。
这个方法的内部实现是:
public virtual ushort ReadUInt16(){
FillBuffer(2);
return (ushort)(m_buffer[0] | m_buffer[1] << 8);
}
我正在读取的二进制文件被组织为高字节优先(大端),我继承自 BinaryReader 也是因为我必须添加更多功能。
无论如何,我想在子类本身中实现交换。
是否有其他方法可以访问m_buffer 或替代方法而不使用反射或其他消耗资源?
也许我应该覆盖FillBuffer 并备份偷看的字节?或者也许只是忽略它?会不会有副作用?有没有人遇到过这个问题?谁能解释为什么FillBuffer 不是内部的?是否需要始终填充缓冲区或可以跳过?既然它不是内部的,为什么不同时实现 m_buffer 字段的受保护吸气剂?
这是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);
}
【问题讨论】:
标签: c# binary endianness binaryreader