EndianBinaryWriter.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System;
  2. using System.IO;
  3. namespace UnityFS
  4. {
  5. public class EndianBinaryWriter : BinaryWriter
  6. {
  7. private readonly byte[] buffer;
  8. public EndianType Endian;
  9. public EndianBinaryWriter(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. public long Length => BaseStream.Length;
  20. public override void Write(short x)
  21. {
  22. Write((ushort)x);
  23. }
  24. private unsafe void WriteBufferBigEndian(byte[] dst, byte* src, int size)
  25. {
  26. System.Diagnostics.Debug.Assert(BitConverter.IsLittleEndian);
  27. for(int i = 0; i < size; i++)
  28. {
  29. dst[i] = src[size - i - 1];
  30. }
  31. }
  32. public unsafe override void Write(ushort x)
  33. {
  34. if (Endian == EndianType.BigEndian)
  35. {
  36. WriteBufferBigEndian(buffer, (byte*)&x, 2);
  37. Write(buffer, 0, 2);
  38. return;
  39. }
  40. base.Write(x);
  41. }
  42. public override void Write(int x)
  43. {
  44. Write((uint)x);
  45. }
  46. public unsafe override void Write(uint x)
  47. {
  48. if (Endian == EndianType.BigEndian)
  49. {
  50. WriteBufferBigEndian(buffer, (byte*)&x, 4);
  51. Write(buffer, 0, 4);
  52. return;
  53. }
  54. base.Write(x);
  55. }
  56. public override void Write(long x)
  57. {
  58. Write((ulong)x);
  59. }
  60. public unsafe override void Write(ulong x)
  61. {
  62. if (Endian == EndianType.BigEndian)
  63. {
  64. WriteBufferBigEndian(buffer, (byte*)&x, 8);
  65. Write(buffer, 0, 8);
  66. return;
  67. }
  68. base.Write(x);
  69. }
  70. public override void Write(float x)
  71. {
  72. if (Endian == EndianType.BigEndian)
  73. {
  74. var buf = BitConverter.GetBytes(x);
  75. Array.Reverse(buf, 0, 4);
  76. Write(buf, 0, 4);
  77. return;
  78. }
  79. base.Write(x);
  80. }
  81. public override void Write(double x)
  82. {
  83. if (Endian == EndianType.BigEndian)
  84. {
  85. var buf = BitConverter.GetBytes(x);
  86. Array.Reverse(buf, 0, 8);
  87. Write(buf, 0, 8);
  88. return;
  89. }
  90. base.Write(x);
  91. }
  92. }
  93. }