diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index 0945f43..0a2369d 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -729,7 +729,7 @@ namespace AssetStudio } } - if (reader.endian == EndianType.BigEndian && componentByteSize > 1) //swap bytes + if (reader.Endian == EndianType.BigEndian && componentByteSize > 1) //swap bytes { for (var i = 0; i < componentBytes.Length / componentByteSize; i++) { diff --git a/AssetStudio/EndianBinaryReader.cs b/AssetStudio/EndianBinaryReader.cs index 5056a66..9beb801 100644 --- a/AssetStudio/EndianBinaryReader.cs +++ b/AssetStudio/EndianBinaryReader.cs @@ -1,23 +1,19 @@ using System; -using System.Collections.Generic; -using System.Text; +using System.Buffers.Binary; using System.IO; namespace AssetStudio { - public enum EndianType - { - LittleEndian, - BigEndian - } - public class EndianBinaryReader : BinaryReader { - public EndianType endian; + private readonly byte[] buffer; + + public EndianType Endian; public EndianBinaryReader(Stream stream, EndianType endian = EndianType.BigEndian) : base(stream) { - this.endian = endian; + Endian = endian; + buffer = new byte[8]; } public long Position @@ -28,88 +24,82 @@ namespace AssetStudio public override short ReadInt16() { - if (endian == EndianType.BigEndian) + if (Endian == EndianType.BigEndian) { - var buff = ReadBytes(2); - Array.Reverse(buff); - return BitConverter.ToInt16(buff, 0); + Read(buffer, 0, 2); + return BinaryPrimitives.ReadInt16BigEndian(buffer); } return base.ReadInt16(); } public override int ReadInt32() { - if (endian == EndianType.BigEndian) + if (Endian == EndianType.BigEndian) { - var buff = ReadBytes(4); - Array.Reverse(buff); - return BitConverter.ToInt32(buff, 0); + Read(buffer, 0, 4); + return BinaryPrimitives.ReadInt32BigEndian(buffer); } return base.ReadInt32(); } public override long ReadInt64() { - if (endian == EndianType.BigEndian) + if (Endian == EndianType.BigEndian) { - var buff = ReadBytes(8); - Array.Reverse(buff); - return BitConverter.ToInt64(buff, 0); + Read(buffer, 0, 8); + return BinaryPrimitives.ReadInt64BigEndian(buffer); } return base.ReadInt64(); } public override ushort ReadUInt16() { - if (endian == EndianType.BigEndian) + if (Endian == EndianType.BigEndian) { - var buff = ReadBytes(2); - Array.Reverse(buff); - return BitConverter.ToUInt16(buff, 0); + Read(buffer, 0, 2); + return BinaryPrimitives.ReadUInt16BigEndian(buffer); } return base.ReadUInt16(); } public override uint ReadUInt32() { - if (endian == EndianType.BigEndian) + if (Endian == EndianType.BigEndian) { - var buff = ReadBytes(4); - Array.Reverse(buff); - return BitConverter.ToUInt32(buff, 0); + Read(buffer, 0, 4); + return BinaryPrimitives.ReadUInt32BigEndian(buffer); } return base.ReadUInt32(); } public override ulong ReadUInt64() { - if (endian == EndianType.BigEndian) + if (Endian == EndianType.BigEndian) { - var buff = ReadBytes(8); - Array.Reverse(buff); - return BitConverter.ToUInt64(buff, 0); + Read(buffer, 0, 8); + return BinaryPrimitives.ReadUInt64BigEndian(buffer); } return base.ReadUInt64(); } public override float ReadSingle() { - if (endian == EndianType.BigEndian) + if (Endian == EndianType.BigEndian) { - var buff = ReadBytes(4); - Array.Reverse(buff); - return BitConverter.ToSingle(buff, 0); + 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) + if (Endian == EndianType.BigEndian) { - var buff = ReadBytes(8); - Array.Reverse(buff); - return BitConverter.ToDouble(buff, 0); + Read(buffer, 0, 8); + Array.Reverse(buffer); + return BitConverter.ToDouble(buffer, 0); } return base.ReadDouble(); } diff --git a/AssetStudio/EndianType.cs b/AssetStudio/EndianType.cs new file mode 100644 index 0000000..e178263 --- /dev/null +++ b/AssetStudio/EndianType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AssetStudio +{ + public enum EndianType + { + LittleEndian, + BigEndian + } +} diff --git a/AssetStudio/ObjectReader.cs b/AssetStudio/ObjectReader.cs index 47b33bc..deb253b 100644 --- a/AssetStudio/ObjectReader.cs +++ b/AssetStudio/ObjectReader.cs @@ -20,7 +20,7 @@ namespace AssetStudio public int[] version => assetsFile.version; public BuildType buildType => assetsFile.buildType; - public ObjectReader(EndianBinaryReader reader, SerializedFile assetsFile, ObjectInfo objectInfo) : base(reader.BaseStream, reader.endian) + public ObjectReader(EndianBinaryReader reader, SerializedFile assetsFile, ObjectInfo objectInfo) : base(reader.BaseStream, reader.Endian) { this.assetsFile = assetsFile; m_PathID = objectInfo.m_PathID; diff --git a/AssetStudio/SerializedFile.cs b/AssetStudio/SerializedFile.cs index d10210d..41f8d90 100644 --- a/AssetStudio/SerializedFile.cs +++ b/AssetStudio/SerializedFile.cs @@ -68,7 +68,7 @@ namespace AssetStudio // ReadMetadata if (m_FileEndianess == 0) { - reader.endian = EndianType.LittleEndian; + reader.Endian = EndianType.LittleEndian; } if (header.m_Version >= SerializedFileFormatVersion.kUnknown_7) { diff --git a/AssetStudio/WebFile.cs b/AssetStudio/WebFile.cs index face612..ca61f85 100644 --- a/AssetStudio/WebFile.cs +++ b/AssetStudio/WebFile.cs @@ -17,7 +17,7 @@ namespace AssetStudio public WebFile(EndianBinaryReader reader) { - reader.endian = EndianType.LittleEndian; + reader.Endian = EndianType.LittleEndian; var signature = reader.ReadStringToNull(); var headLength = reader.ReadInt32(); var dataList = new List();