private bool CheckArchiveCrc() { var RawBuffer = ReadStream_.GetRawBuffer(); // Header foreach (var Ch in Header) { if (ReadStream_.ReadInt8() != (byte)Ch) { LLogger.LError("is invalid lite archive file"); return(false); } } // Version var VersionCode = ReadStream_.ReadInt32(); if (VersionCode < ForceVersionCode) { LLogger.LError($"force require version {ForceVersionCode}, current is {VersionCode}"); return(false); } if (VersionCode < CurrentVersionCode) { // compatible code } // Length var Length = ReadStream_.ReadInt32(); if (Length != RawBuffer.Length) { LLogger.LError($"error archive file length, expect : {Length}, but now : {RawBuffer.Length}"); return(false); } // Crc32 var CrcCode = ReadStream_.ReadUInt32(); var DataStart = Header.Length + 4 + 4 + 4; var DataLength = RawBuffer.Length - DataStart; var Code = Crc32.Calculate(RawBuffer, DataStart, DataLength); if (Code != CrcCode) { LLogger.LError("archive data is broken"); return(false); } return(true); }
private (string, object) ReadFromStream(ArchiveReadStream Stream) { var Key = Stream.ReadString(); var DataType = (ArchiveDataType)Stream.ReadInt8(); switch (DataType) { case ArchiveDataType.Bool: return(Key, Stream.ReadBool()); case ArchiveDataType.Int8: return(Key, Stream.ReadInt8()); case ArchiveDataType.Int16: return(Key, Stream.ReadInt16()); case ArchiveDataType.Int32: return(Key, Stream.ReadInt32()); case ArchiveDataType.UInt32: return(Key, Stream.ReadUInt32()); case ArchiveDataType.Int64: return(Key, Stream.ReadInt64()); case ArchiveDataType.Float: return(Key, Stream.ReadFloat()); case ArchiveDataType.Double: return(Key, Stream.ReadDouble()); case ArchiveDataType.String: return(Key, Stream.ReadString()); case ArchiveDataType.BigInteger: return(Key, Stream.ReadBigInteger()); case ArchiveDataType.Vector2: return(Key, new UnityEngine.Vector2(Stream.ReadFloat(), Stream.ReadFloat())); case ArchiveDataType.Vector3: return(Key, new UnityEngine.Vector3(Stream.ReadFloat(), Stream.ReadFloat(), Stream.ReadFloat())); case ArchiveDataType.Vector2Int: return(Key, new UnityEngine.Vector2Int(Stream.ReadInt32(), Stream.ReadInt32())); case ArchiveDataType.Vector3Int: return(Key, new UnityEngine.Vector3Int(Stream.ReadInt32(), Stream.ReadInt32(), Stream.ReadInt32())); case ArchiveDataType.ArrayBool: return(Key, Stream.ReadArrayBool()); case ArchiveDataType.ArrayInt32: return(Key, Stream.ReadArrayInt32()); case ArchiveDataType.Array2Int32: return(Key, Stream.ReadArray2Int32()); case ArchiveDataType.ArrayBigInteger: return(Key, Stream.ReadArrayBigInteger()); case ArchiveDataType.Array2BigInteger: return(Key, Stream.ReadArray2BigInteger()); case ArchiveDataType.ArrayString: return(Key, Stream.ReadArrayString()); case ArchiveDataType.Array: var Count = Stream.ReadInt16(); if (Count == -1) { return(Key, null); } var ArrayT = Type.GetType(Stream.ReadString()); var ArrayValue = new object[Count]; for (var Index = 0; Index < Count; ++Index) { if (Stream.ReadBool() == false) { ArrayValue[Index] = default; } else { ArrayValue[Index] = ReadFromSubStream(Stream, ArrayT); } } return(Key, ArrayValue); case ArchiveDataType.Array2: var Width = Stream.ReadInt16(); if (Width == 0) { return(Key, null); } var Height = Stream.ReadInt16(); var Array2T = Type.GetType(Stream.ReadString()); var Array2Value = new object[Width, Height]; for (var X = 0; X < Width; ++X) { for (var Y = 0; Y < Height; ++Y) { if (Stream.ReadBool() == false) { Array2Value[X, Y] = default; } else { Array2Value[X, Y] = ReadFromSubStream(Stream, Array2T); } } } return(Key, Array2Value); case ArchiveDataType.Sub: var SubType = Type.GetType(Stream.ReadString()); return(Key, ReadFromSubStream(Stream, SubType)); default: break; } return(string.Empty, null); }