| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- using System;
- using System.IO;
- namespace UnityFS
- {
- public class EndianBinaryWriter : BinaryWriter
- {
- private readonly byte[] buffer;
- public EndianType Endian;
- public EndianBinaryWriter(Stream stream, EndianType endian = EndianType.BigEndian) : base(stream)
- {
- Endian = endian;
- buffer = new byte[8];
- }
- public long Position
- {
- get => BaseStream.Position;
- set => BaseStream.Position = value;
- }
- public long Length => BaseStream.Length;
- public override void Write(short x)
- {
- Write((ushort)x);
- }
- private unsafe void WriteBufferBigEndian(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 unsafe override void Write(ushort x)
- {
- if (Endian == EndianType.BigEndian)
- {
- WriteBufferBigEndian(buffer, (byte*)&x, 2);
- Write(buffer, 0, 2);
- return;
- }
- base.Write(x);
- }
- public override void Write(int x)
- {
- Write((uint)x);
- }
- public unsafe override void Write(uint x)
- {
- if (Endian == EndianType.BigEndian)
- {
- WriteBufferBigEndian(buffer, (byte*)&x, 4);
- Write(buffer, 0, 4);
- return;
- }
- base.Write(x);
- }
- public override void Write(long x)
- {
- Write((ulong)x);
- }
- public unsafe override void Write(ulong x)
- {
- if (Endian == EndianType.BigEndian)
- {
- WriteBufferBigEndian(buffer, (byte*)&x, 8);
- Write(buffer, 0, 8);
- return;
- }
- base.Write(x);
- }
- public override void Write(float x)
- {
- if (Endian == EndianType.BigEndian)
- {
- var buf = BitConverter.GetBytes(x);
- Array.Reverse(buf, 0, 4);
- Write(buf, 0, 4);
- return;
- }
- base.Write(x);
- }
- public override void Write(double x)
- {
- if (Endian == EndianType.BigEndian)
- {
- var buf = BitConverter.GetBytes(x);
- Array.Reverse(buf, 0, 8);
- Write(buf, 0, 8);
- return;
- }
- base.Write(x);
- }
- }
- }
|