EndianBinaryReader.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System;
  2. using System.IO;
  3. namespace UnityFS
  4. {
  5. public class EndianBinaryReader : BinaryReader
  6. {
  7. private readonly byte[] buffer;
  8. public EndianType Endian;
  9. public EndianBinaryReader(Stream stream, EndianType endian = EndianType.BigEndian) : base(stream)
  10. {
  11. Endian = endian;
  12. buffer = new byte[8];
  13. }
  14. public long Position
  15. {
  16. get => BaseStream.Position;
  17. set => BaseStream.Position = value;
  18. }
  19. private unsafe void ReadBufferBigEndian(byte* dst, byte[] src, int size)
  20. {
  21. System.Diagnostics.Debug.Assert(BitConverter.IsLittleEndian);
  22. for (int i = 0; i < size; i++)
  23. {
  24. dst[i] = src[size - i - 1];
  25. }
  26. }
  27. public override short ReadInt16()
  28. {
  29. return (short)ReadUInt16();
  30. }
  31. public unsafe override ushort ReadUInt16()
  32. {
  33. if (Endian == EndianType.BigEndian)
  34. {
  35. Read(buffer, 0, 2);
  36. ushort x = 0;
  37. ReadBufferBigEndian((byte*)&x, buffer, 2);
  38. return x;
  39. }
  40. return base.ReadUInt16();
  41. }
  42. public override int ReadInt32()
  43. {
  44. return (int)ReadUInt32();
  45. }
  46. public unsafe override uint ReadUInt32()
  47. {
  48. if (Endian == EndianType.BigEndian)
  49. {
  50. Read(buffer, 0, 4);
  51. uint x = 0;
  52. ReadBufferBigEndian((byte*)&x, buffer, 4);
  53. return x;
  54. }
  55. return base.ReadUInt32();
  56. }
  57. public override long ReadInt64()
  58. {
  59. return (long)ReadUInt64();
  60. }
  61. public unsafe override ulong ReadUInt64()
  62. {
  63. if (Endian == EndianType.BigEndian)
  64. {
  65. Read(buffer, 0, 8);
  66. ulong x = 0;
  67. ReadBufferBigEndian((byte*)&x, buffer, 8);
  68. return x;
  69. }
  70. return base.ReadUInt64();
  71. }
  72. public override float ReadSingle()
  73. {
  74. if (Endian == EndianType.BigEndian)
  75. {
  76. Read(buffer, 0, 4);
  77. Array.Reverse(buffer, 0, 4);
  78. return BitConverter.ToSingle(buffer, 0);
  79. }
  80. return base.ReadSingle();
  81. }
  82. public override double ReadDouble()
  83. {
  84. if (Endian == EndianType.BigEndian)
  85. {
  86. Read(buffer, 0, 8);
  87. Array.Reverse(buffer);
  88. return BitConverter.ToDouble(buffer, 0);
  89. }
  90. return base.ReadDouble();
  91. }
  92. }
  93. }