-
Notifications
You must be signed in to change notification settings - Fork 125
Expand file tree
/
Copy pathAssetsFileHeader.cs
More file actions
83 lines (80 loc) · 2.48 KB
/
AssetsFileHeader.cs
File metadata and controls
83 lines (80 loc) · 2.48 KB
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AssetsTools.NET
{
public class AssetsFileHeader
{
public uint metadataSize;
public long fileSize;
public uint format;
public long firstFileOffset;
public uint endianness;
public byte[] unknown;
public uint unknown1;
public uint unknown2;
public int GetSizeBytes()
{
if (format < 9)
return 0x10;
else
return 0x14;
}
public void Read(AssetsFileStatefulReader reader)
{
metadataSize = reader.ReadUInt32();
fileSize = reader.ReadUInt32();
format = reader.ReadUInt32();
firstFileOffset = reader.ReadUInt32();
endianness = reader.ReadByte(); //todo "fileSize - metadataSize" for v<9 but I have no files to test on
unknown = reader.ReadBytes(3);
reader.Align();
if (format >= 0x16)
{
metadataSize = reader.ReadUInt32();
fileSize = reader.ReadInt64();
firstFileOffset = reader.ReadInt64();
}
reader.bigEndian = endianness == 1;
if (format >= 0x16)
{
unknown1 = reader.ReadUInt32(); //seen as 0x00 everywhere
unknown2 = reader.ReadUInt32(); //seen as 0x1b in bundles and 0x00 everywhere else
}
}
public void Write(AssetsFileWriter writer)
{
writer.bigEndian = true;
if (format >= 0x16)
{
writer.Write(0);
writer.Write(0);
writer.Write(format);
writer.Write(0);
}
else
{
writer.Write(metadataSize);
writer.Write((uint)fileSize);
writer.Write(format);
writer.Write((uint)firstFileOffset);
}
writer.Write((byte)endianness);
writer.Write(unknown);
writer.Align();
if (format >= 0x16)
{
writer.Write(metadataSize);
writer.Write(fileSize);
writer.Write(firstFileOffset);
}
writer.bigEndian = endianness == 1;
if (format >= 0x16)
{
writer.Write(unknown1);
writer.Write(unknown2);
}
}
}
}