三国卡牌客户端基础资源仓库
hch
2025-09-11 9e1075c83ce5dace7adce242083788bdffdf5d0c
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 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();
        }
    }
}