| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- using System;
- using System.IO;
- namespace UnityFS
- {
- public class EndianBinaryReader : BinaryReader
- {
- private readonly byte[] buffer;
- public EndianType Endian;
- public EndianBinaryReader(Stream stream, EndianType endian = EndianType.BigEndian) : base(stream)
- {
- Endian = endian;
- buffer = new byte[8];
- }
- public long Position
- {
- get => BaseStream.Position;
- set => BaseStream.Position = value;
- }
- private unsafe void ReadBufferBigEndian(byte* dst, byte[] src, int size)
- {
- System.Diagnostics.Debug.Assert(BitConverter.IsLittleEndian);
- for (int i = 0; i < size; i++)
- {
- dst[i] = src[size - i - 1];
- }
- }
- public override short ReadInt16()
- {
- return (short)ReadUInt16();
- }
- public unsafe override ushort ReadUInt16()
- {
- if (Endian == EndianType.BigEndian)
- {
- Read(buffer, 0, 2);
- ushort x = 0;
- ReadBufferBigEndian((byte*)&x, buffer, 2);
- return x;
- }
- return base.ReadUInt16();
- }
- public override int ReadInt32()
- {
- return (int)ReadUInt32();
- }
- public unsafe override uint ReadUInt32()
- {
- if (Endian == EndianType.BigEndian)
- {
- Read(buffer, 0, 4);
- uint x = 0;
- ReadBufferBigEndian((byte*)&x, buffer, 4);
- return x;
- }
- return base.ReadUInt32();
- }
- public override long ReadInt64()
- {
- return (long)ReadUInt64();
- }
- public unsafe override ulong ReadUInt64()
- {
- if (Endian == EndianType.BigEndian)
- {
- Read(buffer, 0, 8);
- ulong x = 0;
- ReadBufferBigEndian((byte*)&x, buffer, 8);
- return x;
- }
- return base.ReadUInt64();
- }
- public override float ReadSingle()
- {
- if (Endian == EndianType.BigEndian)
- {
- Read(buffer, 0, 4);
- Array.Reverse(buffer, 0, 4);
- return BitConverter.ToSingle(buffer, 0);
- }
- return base.ReadSingle();
- }
- public override double ReadDouble()
- {
- if (Endian == EndianType.BigEndian)
- {
- Read(buffer, 0, 8);
- Array.Reverse(buffer);
- return BitConverter.ToDouble(buffer, 0);
- }
- return base.ReadDouble();
- }
- }
- }
|