三国卡牌客户端基础资源仓库
hch
2025-06-20 4841e82bd5e399c4fc39313bbc93c6fc1bb12b2a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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);
        }
    }
}