Update FileReader & EndianSpanReader

This commit is contained in:
VaDiM
2025-07-22 18:11:26 +03:00
parent 9c64f7f56d
commit 925f5c12a3
3 changed files with 27 additions and 25 deletions

View File

@ -57,7 +57,7 @@ namespace AssetStudio
}
isBigEndian = BitConverter.ToBoolean(modelData, 5);
var modelDataSpan = modelData.AsSpan();
var modelDataSpan = new ReadOnlySpan<byte>(modelData, 0, modelDataSize);
//offsets
var countInfoTableOffset = (int)modelDataSpan.ReadUInt32(64, isBigEndian);
var canvasInfoOffset = (int)modelDataSpan.ReadUInt32(68, isBigEndian);
@ -74,8 +74,8 @@ namespace AssetStudio
//model
PartCount = modelDataSpan.ReadUInt32(countInfoTableOffset, isBigEndian);
ParamCount = modelDataSpan.ReadUInt32(countInfoTableOffset + 20, isBigEndian);
PartNames = ReadMocStrings(modelData, (int)partIdsOffset, (int)PartCount);
ParamNames = ReadMocStrings(modelData, (int)parameterIdsOffset, (int)ParamCount);
PartNames = ReadMocStrings(modelDataSpan, (int)partIdsOffset, (int)PartCount);
ParamNames = ReadMocStrings(modelDataSpan, (int)parameterIdsOffset, (int)ParamCount);
}
public void SaveMoc3(string savePath)
@ -102,7 +102,7 @@ namespace AssetStudio
}
}
private static HashSet<string> ReadMocStrings(Span<byte> data, int index, int count)
private static HashSet<string> ReadMocStrings(ReadOnlySpan<byte> data, int index, int count)
{
const int strLen = 64;
var strHashSet = new HashSet<string>();

View File

@ -8,10 +8,10 @@ namespace AssetStudio
{
public static uint ReadUInt32(this Span<byte> data, int start, bool isBigEndian)
{
return SpanToUInt32(data, start, isBigEndian);
return ReadUInt32((ReadOnlySpan<byte>)data, start, isBigEndian);
}
public static uint SpanToUInt32(Span<byte> data, int start, bool isBigEndian)
public static uint ReadUInt32(this ReadOnlySpan<byte> data, int start, bool isBigEndian)
{
return isBigEndian
? BinaryPrimitives.ReadUInt32BigEndian(data.Slice(start))
@ -20,10 +20,10 @@ namespace AssetStudio
public static long ReadUInt16(this Span<byte> data, int start, bool isBigEndian)
{
return SpanToUInt16(data, start, isBigEndian);
return ReadUInt16((ReadOnlySpan<byte>)data, start, isBigEndian);
}
public static uint SpanToUInt16(Span<byte> data, int start, bool isBigEndian)
public static uint ReadUInt16(this ReadOnlySpan<byte> data, int start, bool isBigEndian)
{
return isBigEndian
? BinaryPrimitives.ReadUInt16BigEndian(data.Slice(start))
@ -32,10 +32,10 @@ namespace AssetStudio
public static long ReadInt64(this Span<byte> data, int start, bool isBigEndian)
{
return SpanToInt64(data, start, isBigEndian);
return ReadInt64((ReadOnlySpan<byte>)data, start, isBigEndian);
}
public static long SpanToInt64(Span<byte> data, int start, bool isBigEndian)
public static long ReadInt64(this ReadOnlySpan<byte> data, int start, bool isBigEndian)
{
return isBigEndian
? BinaryPrimitives.ReadInt64BigEndian(data.Slice(start))
@ -44,20 +44,20 @@ namespace AssetStudio
public static float ReadSingle(this Span<byte> data, int start, bool isBigEndian)
{
return SpanToSingle(data, start, isBigEndian);
return ReadSingle((ReadOnlySpan<byte>)data, start, isBigEndian);
}
#if NETFRAMEWORK
public static float SpanToSingle(Span<byte> data, int start, bool isBigEndian)
public static float ReadSingle(this ReadOnlySpan<byte> data, int start, bool isBigEndian)
{
var bytes = data.Slice(start, 4);
var bytes = data.Slice(start, 4).ToArray();
if ((isBigEndian && BitConverter.IsLittleEndian) || (!isBigEndian && !BitConverter.IsLittleEndian))
bytes.Reverse();
bytes.AsSpan().Reverse();
return BitConverter.ToSingle(bytes.ToArray(), 0);
return BitConverter.ToSingle(bytes, 0);
}
#else
public static float SpanToSingle(Span<byte> data, int start, bool isBigEndian)
public static float ReadSingle(this ReadOnlySpan<byte> data, int start, bool isBigEndian)
{
return isBigEndian
? BinaryPrimitives.ReadSingleBigEndian(data[start..])
@ -66,6 +66,11 @@ namespace AssetStudio
#endif
public static string ReadStringToNull(this Span<byte> data, int maxLength = 32767)
{
return ReadStringToNull((ReadOnlySpan<byte>)data, maxLength);
}
public static string ReadStringToNull(this ReadOnlySpan<byte> data, int maxLength = 32767)
{
Span<byte> bytes = stackalloc byte[maxLength];
var count = 0;

View File

@ -13,7 +13,7 @@ namespace AssetStudio
private static readonly byte[] brotliMagic = { 0x62, 0x72, 0x6F, 0x74, 0x6C, 0x69 };
private static readonly byte[] zipMagic = { 0x50, 0x4B, 0x03, 0x04 };
private static readonly byte[] zipSpannedMagic = { 0x50, 0x4B, 0x07, 0x08 };
private static readonly byte[] unityFsMagic = {0x55, 0x6E, 0x69, 0x74, 0x79, 0x46, 0x53};
private static readonly byte[] unityFsMagic = {0x55, 0x6E, 0x69, 0x74, 0x79, 0x46, 0x53, 0x00};
private static readonly int headerBuffLen = 1152;
private static byte[] headerBuff = new byte[headerBuffLen];
@ -43,7 +43,6 @@ namespace AssetStudio
CheckBundleDataOffset(buff);
return FileType.BundleFile;
case "UnityWebData1.0":
return FileType.WebFile;
case "TuanjieWebData1.0":
return FileType.WebFile;
default:
@ -83,7 +82,7 @@ namespace AssetStudio
}
}
private bool IsSerializedFile(Span<byte> buff)
private bool IsSerializedFile(ReadOnlySpan<byte> buff)
{
var fileSize = BaseStream.Length;
if (fileSize < 20)
@ -129,12 +128,10 @@ namespace AssetStudio
return true;
}
Position = firstOffset;
_ = this.ReadStringToNull();
_ = this.ReadUInt32();
_ = this.ReadStringToNull();
_ = this.ReadStringToNull();
var bundleSize = this.ReadInt64();
var pos = firstOffset + 12;
pos += buff.Slice(pos).ReadStringToNull().Length + 1;
pos += buff.Slice(pos).ReadStringToNull().Length + 1;
var bundleSize = buff.ReadInt64(pos, Endian == EndianType.BigEndian);
if (bundleSize > 200 && firstOffset + bundleSize < lastOffset)
{
Position = firstOffset;