76 lines
2.3 KiB
C#
76 lines
2.3 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace Cryville.Common.IO {
|
|
public class BinaryReaderBE : BinaryReader {
|
|
readonly byte[] m_buffer = new byte[8];
|
|
|
|
public BinaryReaderBE(Stream input) : base(input) { }
|
|
|
|
public BinaryReaderBE(Stream input, Encoding encoding) : base(input, encoding) { }
|
|
|
|
public BinaryReaderBE(Stream input, Encoding encoding, bool leaveOpen) : base(input, encoding, leaveOpen) { }
|
|
|
|
public override short ReadInt16() {
|
|
FillBuffer(2);
|
|
return (short)(m_buffer[1] | (m_buffer[0] << 8));
|
|
}
|
|
public override ushort ReadUInt16() {
|
|
FillBuffer(2);
|
|
return (ushort)(m_buffer[1] | (m_buffer[0] << 8));
|
|
}
|
|
|
|
public override int ReadInt32() {
|
|
FillBuffer(4);
|
|
return m_buffer[3] | (m_buffer[2] << 8) | (m_buffer[1] << 16) | (m_buffer[0] << 24);
|
|
}
|
|
public override uint ReadUInt32() {
|
|
FillBuffer(4);
|
|
return (uint)(m_buffer[3] | (m_buffer[2] << 8) | (m_buffer[1] << 16) | (m_buffer[0] << 24));
|
|
}
|
|
|
|
public override long ReadInt64() {
|
|
FillBuffer(8);
|
|
uint num = (uint)(m_buffer[7] | (m_buffer[6] << 8) | (m_buffer[5] << 16) | (m_buffer[4] << 24));
|
|
uint num2 = (uint)(m_buffer[3] | (m_buffer[2] << 8) | (m_buffer[1] << 16) | (m_buffer[0] << 24));
|
|
return (long)(((ulong)num2 << 32) | num);
|
|
}
|
|
public override ulong ReadUInt64() {
|
|
FillBuffer(8);
|
|
uint num = (uint)(m_buffer[7] | (m_buffer[6] << 8) | (m_buffer[5] << 16) | (m_buffer[4] << 24));
|
|
uint num2 = (uint)(m_buffer[3] | (m_buffer[2] << 8) | (m_buffer[1] << 16) | (m_buffer[0] << 24));
|
|
return ((ulong)num2 << 32) | num;
|
|
}
|
|
protected new void FillBuffer(int numBytes) {
|
|
if (m_buffer != null && (numBytes < 0 || numBytes > m_buffer.Length)) {
|
|
throw new ArgumentOutOfRangeException("numBytes", "Requested numBytes is larger than the internal buffer size");
|
|
}
|
|
|
|
int num = 0, num2;
|
|
if (BaseStream == null) {
|
|
throw new IOException("File not open");
|
|
}
|
|
|
|
if (numBytes == 1) {
|
|
num2 = BaseStream.ReadByte();
|
|
if (num2 == -1) {
|
|
throw new EndOfStreamException("The end of the stream is reached before numBytes could be read");
|
|
}
|
|
m_buffer[0] = (byte)num2;
|
|
return;
|
|
}
|
|
|
|
do {
|
|
num2 = BaseStream.Read(m_buffer, num, numBytes - num);
|
|
if (num2 == 0) {
|
|
throw new EndOfStreamException("The end of the stream is reached before numBytes could be read");
|
|
}
|
|
|
|
num += num2;
|
|
}
|
|
while (num < numBytes);
|
|
}
|
|
}
|
|
}
|