Skip to content

Commit 64f840f

Browse files
committed
Re-factor big endianess and memory decoding.
1 parent e67e1b0 commit 64f840f

File tree

4 files changed

+231
-121
lines changed

4 files changed

+231
-121
lines changed

src/Core/Classes/UObject.cs

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -187,24 +187,42 @@ public void BeginDeserializing()
187187

188188
private void InitBuffer()
189189
{
190-
Package.Stream.Seek(ExportTable.SerialOffset, SeekOrigin.Begin);
190+
InitBuffer(Package.Stream);
191+
}
191192

192-
//Console.WriteLine( "Init buffer for {0}", (string)this );
193-
var buffer = new byte[ExportTable.SerialSize];
194-
_Buffer = new UObjectRecordStream(Package.Stream, buffer);
195-
#if HUXLEY
196-
_Buffer.Decoder = Package.Stream.Decoder;
193+
private void InitBuffer(UPackageStream stream)
194+
{
195+
long objectOffset = ExportTable.SerialOffset;
196+
int objectSize = ExportTable.SerialSize;
197197

198-
Package.Stream.Decoder = null;
199-
#endif
200-
// Bypass the terrible and slow endian reverse call
201-
int read = Package.Stream.EndianAgnosticRead(buffer, 0, ExportTable.SerialSize);
202-
#if HUXLEY
203-
Package.Stream.Decoder = _Buffer.Decoder;
204-
#endif
205-
Contract.Assert(ExportTable.SerialOffset + ExportTable.SerialSize <= Package.Stream.Length,
206-
"Exceeded file's length");
207-
//Debug.Assert(read == ExportTable.SerialSize, $"Incomplete read; expected a total bytes of {ExportTable.SerialSize} but got {read}");
198+
byte[] buffer = new byte[objectSize];
199+
int byteCount;
200+
201+
// Make an object stream with a decoder as the base stream.
202+
if (stream.Decoder != null)
203+
{
204+
var decoder = stream.Decoder;
205+
// Read without decoding, because the encryption may be affected by the read count. e.g. "Huxley"
206+
stream.Decoder = null;
207+
// Bypass the terrible and slow endian reverse call
208+
stream.Seek(objectOffset, SeekOrigin.Begin);
209+
byteCount = stream.EndianAgnosticRead(buffer, 0, objectSize);
210+
stream.Decoder = decoder;
211+
212+
var baseStream = new MemoryDecoderStream(stream.Decoder, buffer, objectOffset);
213+
_Buffer = new UObjectRecordStream(stream, baseStream);
214+
}
215+
else
216+
{
217+
// Bypass the terrible and slow endian reverse call
218+
stream.Seek(objectOffset, SeekOrigin.Begin);
219+
byteCount = stream.EndianAgnosticRead(buffer, 0, objectSize);
220+
221+
_Buffer = new UObjectRecordStream(stream, buffer);
222+
}
223+
224+
Contract.Assert(byteCount == objectSize,
225+
$"Incomplete read; expected a total bytes of {objectSize} but got {byteCount}");
208226
}
209227

210228
internal void EnsureBuffer()
@@ -223,7 +241,7 @@ internal void MaybeDisposeBuffer()
223241
if (_Buffer == null || (DeserializationState & ObjectState.Deserializing) != 0)
224242
return;
225243

226-
_Buffer.DisposeBuffer();
244+
_Buffer.Dispose();
227245
_Buffer = null;
228246
//Console.WriteLine( "Disposed" );
229247
}

src/Core/Tables/UObjectTableItem.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,9 @@ public static string GetReferencePath([CanBeNull] UObjectTableItem item)
104104

105105
public virtual byte[] CopyBuffer()
106106
{
107-
var buff = new byte[Size];
107+
byte[] buff = new byte[Size];
108108
Owner.Stream.Seek(Offset, SeekOrigin.Begin);
109-
Owner.Stream.Read(buff, 0, Size);
110-
if (Owner.Stream.BigEndianCode)
111-
{
112-
Array.Reverse(buff);
113-
}
109+
Owner.Stream.EndianAgnosticRead(buff, 0, Size);
114110

115111
return buff;
116112
}

src/UnrealPackage.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2585,10 +2585,9 @@ public bool ContainsEditorData()
25852585

25862586
public byte[] CopyBuffer()
25872587
{
2588-
var buff = new byte[HeaderSize];
2588+
byte[] buff = new byte[Summary.HeaderSize];
25892589
Stream.Seek(0, SeekOrigin.Begin);
2590-
Stream.Read(buff, 0, HeaderSize);
2591-
if (Stream.BigEndianCode) Array.Reverse(buff);
2590+
Stream.EndianAgnosticRead(buff, 0, Summary.HeaderSize);
25922591

25932592
return buff;
25942593
}

0 commit comments

Comments
 (0)