Add StreamData{Reader/Writer}

This commit is contained in:
miku-666
2022-07-14 03:51:25 +02:00
parent 63d80d639f
commit 7f477b1b28
9 changed files with 152 additions and 132 deletions

View File

@@ -9,7 +9,7 @@ using PckStudio.Classes.Utils;
namespace PckStudio.Classes.IO.GRF
{
internal class GRFFileReader
internal class GRFFileReader : StreamDataReader
{
internal List<string> TagNames;
internal GRFFile _file;
@@ -18,6 +18,9 @@ namespace PckStudio.Classes.IO.GRF
return new GRFFileReader().read(stream);
}
private GRFFileReader() : base(false)
{ }
private GRFFile read(Stream stream)
{
stream = ReadHeader(stream);
@@ -144,35 +147,10 @@ namespace PckStudio.Classes.IO.GRF
return new ValueTuple<string, string>(GetTagName(stream), ReadString(stream));
}
internal byte[] ReadBytes(Stream stream, int count)
{
byte[] buffer = new byte[count];
stream.Read(buffer, 0, count);
return buffer;
}
internal int ReadInt(Stream stream)
{
byte[] buffer = ReadBytes(stream, 4);
if (BitConverter.IsLittleEndian)
Array.Reverse(buffer);
return BitConverter.ToInt32(buffer, 0);
}
internal short ReadShort(Stream stream)
{
byte[] buffer = ReadBytes(stream, 2);
if (BitConverter.IsLittleEndian)
Array.Reverse(buffer);
return BitConverter.ToInt16(buffer, 0);
}
internal string ReadString(Stream stream)
{
short stringLength = ReadShort(stream);
byte[] buffer = ReadBytes(stream, stringLength);
return Encoding.ASCII.GetString(buffer);
return ReadString(stream, stringLength, Encoding.ASCII);
}
}
}

View File

@@ -5,12 +5,13 @@ using System.IO;
using System.Linq;
using System.Text;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using PckStudio.Classes.Utils;
using PckStudio.Classes;
using PckStudio.Classes.Utils.grf;
using PckStudio.Classes.Utils;
namespace PckStudio.Classes.IO.GRF
{
public class GRFFileWriter
internal class GRFFileWriter : StreamDataWriter
{
internal readonly GRFFile _grfFile;
internal List<string> LUT;
@@ -20,7 +21,7 @@ namespace PckStudio.Classes.IO.GRF
instance.write(stream);
}
private GRFFileWriter(GRFFile grfFile)
private GRFFileWriter(GRFFile grfFile) : base(false)
{
if (grfFile.IsWorld)
throw new NotImplementedException("World grf saving is currently unsupported");
@@ -73,7 +74,7 @@ namespace PckStudio.Classes.IO.GRF
return result;
}
private byte[] CompressRle(byte[] buffer) => RLE<byte>.Encode(buffer).ToArray();
private byte[] CompressRle(byte[] buffer) => Utils.RLE<byte>.Encode(buffer).ToArray();
private void MakeAndWriteCrc(Stream stream, byte[] data)
{
@@ -151,31 +152,10 @@ namespace PckStudio.Classes.IO.GRF
WriteInt(stream, i);
}
static internal void WriteInt(Stream stream, int value)
{
byte[] bytes = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
WriteBytes(stream, bytes);
}
static internal void WriteShort(Stream stream, short value)
{
byte[] bytes = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
WriteBytes(stream, bytes);
}
static internal void WriteString(Stream stream, string s)
{
WriteShort(stream, (short)s.Length);
WriteBytes(stream, Encoding.ASCII.GetBytes(s));
}
static internal void WriteBytes(Stream stream, byte[] bytes)
{
stream.Write(bytes, 0, bytes.Length);
}
}
}

View File

@@ -3,10 +3,11 @@ using System.Collections.Generic;
using System.IO;
using System.Text;
using PckStudio.Classes.FileTypes;
using PckStudio.Classes.Utils;
namespace PckStudio.Classes.IO.LOC
{
internal class LOCFileReader
internal class LOCFileReader : StreamDataReader
{
internal LOCFile _file;
@@ -15,7 +16,7 @@ namespace PckStudio.Classes.IO.LOC
return new LOCFileReader().ReadFile(stream);
}
private LOCFileReader()
private LOCFileReader() : base(false)
{
_file = new LOCFile();
}
@@ -70,29 +71,10 @@ namespace PckStudio.Classes.IO.LOC
return keys;
}
internal short ReadShort(Stream stream)
{
byte[] bytes = new byte[2];
stream.Read(bytes, 0, bytes.Length);
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
return BitConverter.ToInt16(bytes, 0);
}
internal int ReadInt(Stream stream)
{
byte[] bytes = new byte[4];
stream.Read(bytes, 0, bytes.Length);
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
return BitConverter.ToInt32(bytes, 0);
}
internal string ReadString(Stream stream)
{
int length = ReadShort(stream);
byte[] buffer = new byte[length];
stream.Read(buffer, 0, length);
return Encoding.UTF8.GetString(buffer, 0, length);
return ReadString(stream, length, Encoding.UTF8);
}
}
}

View File

@@ -1,4 +1,5 @@
using PckStudio.Classes.FileTypes;
using PckStudio.Classes.Utils;
using System;
using System.Collections.Generic;
using System.IO;
@@ -7,7 +8,7 @@ using System.Text;
namespace PckStudio.Classes.IO.LOC
{
internal class LOCFileWriter
internal class LOCFileWriter : StreamDataWriter
{
internal LOCFile _locfile;
public static void Write(Stream stream, LOCFile file, int type = 2)
@@ -15,7 +16,7 @@ namespace PckStudio.Classes.IO.LOC
new LOCFileWriter(file).WriteToStream(stream, type);
}
private LOCFileWriter(LOCFile file)
private LOCFileWriter(LOCFile file) : base(false)
{
_locfile = file;
}
@@ -64,26 +65,10 @@ namespace PckStudio.Classes.IO.LOC
}
}
internal void WriteShort(Stream stream, short value)
{
byte[] bytes = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
stream.Write(bytes, 0, 2);
}
internal void WriteInt(Stream stream, int value)
{
byte[] bytes = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
stream.Write(bytes, 0, 4);
}
internal void WriteString(Stream stream, string s)
{
WriteShort(stream, (short)s.Length);
byte[] buffer = Encoding.UTF8.GetBytes(s);
stream.Write(buffer, 0, s.Length);
WriteString(stream, s, Encoding.UTF8);
}
}
}

View File

@@ -1,4 +1,5 @@
using PckStudio.Classes.FileTypes;
using PckStudio.Classes.Utils;
using System;
using System.Collections.Generic;
using System.IO;
@@ -7,26 +8,24 @@ using System.Windows;
namespace PckStudio.Classes.IO
{
internal class PCKFileReader
internal class PCKFileReader : StreamDataReader
{
internal bool isLittleEndian = false;
internal PCKFile _file;
public static PCKFile Read(Stream s, bool isLittleEndian)
public static PCKFile Read(Stream stream, bool isLittleEndian)
{
return new PCKFileReader(isLittleEndian).ReadFileFromStream(s);
return new PCKFileReader(isLittleEndian).ReadFileFromStream(stream);
}
private PCKFileReader(bool isLittleEndian)
private PCKFileReader(bool isLittleEndian) : base(isLittleEndian)
{
this.isLittleEndian = isLittleEndian;
}
private PCKFile ReadFileFromStream(Stream s)
private PCKFile ReadFileFromStream(Stream stream)
{
_file = new PCKFile(ReadInt(s));
ReadMetaData(s);
ReadFileEntries(s);
_file = new PCKFile(ReadInt(stream));
ReadMetaData(stream);
ReadFileEntries(stream);
return _file;
}
@@ -71,23 +70,12 @@ namespace PckStudio.Classes.IO
stream.Read(file_entry.data, 0, file_entry.size);
}
}
internal int ReadInt(Stream stream)
{
byte[] buffer = new byte[4];
stream.Read(buffer, 0, 4);
if (BitConverter.IsLittleEndian && !isLittleEndian)
Array.Reverse(buffer);
return BitConverter.ToInt32(buffer, 0);
}
internal string ReadString(Stream stream)
{
int len = ReadInt(stream);
byte[] stringBuffer = new byte[len * 2];
stream.Read(stringBuffer, 0, len * 2);
ReadInt(stream);
return Encoding.BigEndianUnicode.GetString(stringBuffer, 0, len * 2);
string s = ReadString(stream, len * 2, Encoding.BigEndianUnicode);
ReadInt(stream); // padding
return s;
}
}
}

View File

@@ -1,4 +1,5 @@
using PckStudio.Classes.FileTypes;
using PckStudio.Classes.Utils;
using System;
using System.Collections.Generic;
using System.IO;
@@ -8,9 +9,8 @@ using System.Threading.Tasks;
namespace PckStudio.Classes.IO
{
internal class PCKFileWriter
internal class PCKFileWriter : StreamDataWriter
{
internal bool isLittleEndian = false;
internal PCKFile _file;
public static void Write(Stream stream, PCKFile file, bool isLittleEndian)
@@ -18,10 +18,9 @@ namespace PckStudio.Classes.IO
new PCKFileWriter(file, isLittleEndian).WriteToStream(stream);
}
private PCKFileWriter(PCKFile file, bool isLittleEndian)
private PCKFileWriter(PCKFile file, bool isLittleEndian) : base(isLittleEndian)
{
_file = file;
this.isLittleEndian = isLittleEndian;
}
private void WriteToStream(Stream stream)
@@ -31,20 +30,11 @@ namespace PckStudio.Classes.IO
WriteFileEntries(stream);
}
internal void WriteInt(Stream stream, int value)
{
byte[] buffer = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian && !isLittleEndian)
Array.Reverse(buffer);
stream.Write(buffer, 0, 4);
}
internal void WriteString(Stream stream, string s)
{
WriteInt(stream, s.Length);
byte[] byteString = Encoding.BigEndianUnicode.GetBytes(s);
stream.Write(byteString, 0, byteString.Length);
WriteInt(stream, 0);
WriteString(stream, s, Encoding.BigEndianUnicode);
WriteInt(stream, 0); // padding
}
internal void WriteMetaEntries(Stream stream)

View File

@@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PckStudio.Classes.Utils
{
public class StreamDataReader
{
private static bool isLittleEndian;
protected StreamDataReader(bool useLittleEndian)
{
isLittleEndian = useLittleEndian;
}
protected static string ReadString(Stream stream, int length, Encoding encoding)
{
byte[] buffer = ReadBytes(stream, length);
return encoding.GetString(buffer);
}
protected static byte[] ReadBytes(Stream stream, int count)
{
byte[] buffer = new byte[count];
stream.Read(buffer, 0, count);
return buffer;
}
protected static ushort ReadUShort(Stream stream) => (ushort)ReadShort(stream);
protected static short ReadShort(Stream stream)
{
byte[] bytes = ReadBytes(stream, 2);
if (BitConverter.IsLittleEndian && !isLittleEndian)
Array.Reverse(bytes);
return BitConverter.ToInt16(bytes, 0);
}
protected static uint ReadUInt(Stream stream) => (uint)ReadInt(stream);
protected static int ReadInt(Stream stream)
{
byte[] buffer = ReadBytes(stream, 4);
if (BitConverter.IsLittleEndian && !isLittleEndian)
Array.Reverse(buffer);
return BitConverter.ToInt32(buffer, 0);
}
protected static ulong ReadULong(Stream stream) => (ulong)ReadLong(stream);
protected static long ReadLong(Stream stream)
{
byte[] buffer = ReadBytes(stream, 8);
if (BitConverter.IsLittleEndian && !isLittleEndian)
Array.Reverse(buffer);
return BitConverter.ToInt64(buffer, 0);
}
}
}

View File

@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PckStudio.Classes.Utils
{
internal class StreamDataWriter
{
private static bool useLittleEndian;
protected StreamDataWriter(bool isLittleEndian)
{
useLittleEndian = isLittleEndian;
}
protected static void WriteUShort(Stream stream, ushort value) => WriteShort(stream, (short)value);
protected static void WriteShort(Stream stream, short value)
{
byte[] bytes = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian && !useLittleEndian)
Array.Reverse(bytes);
WriteBytes(stream, bytes, 2);
}
protected static void WriteUInt(Stream stream, uint value) => WriteInt(stream, (int)value);
protected static void WriteInt(Stream stream, int value)
{
byte[] buffer = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian && !useLittleEndian)
Array.Reverse(buffer);
WriteBytes(stream, buffer, 4);
}
protected static void WriteULong(Stream stream, ulong value) => WriteLong(stream, (long)value);
protected static void WriteLong(Stream stream, long value)
{
byte[] buffer = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian && !useLittleEndian)
Array.Reverse(buffer);
WriteBytes(stream, buffer, 8);
}
protected static void WriteString(Stream stream, string s, Encoding encoding)
=> WriteBytes(stream, encoding.GetBytes(s));
protected static void WriteBytes(Stream stream, byte[] bytes) => WriteBytes(stream, bytes, bytes.Length);
protected static void WriteBytes(Stream stream, byte[] bytes, int count)
{
stream.Write(bytes, 0, count);
}
}
}

View File

@@ -154,6 +154,8 @@
<Compile Include="Classes\IO\PCKCollectionsLocal.cs" />
<Compile Include="Classes\IO\PCK\PCKFileReader.cs" />
<Compile Include="Classes\IO\PCK\PCKFileWriter.cs" />
<Compile Include="Classes\Utils\StreamDataReader.cs" />
<Compile Include="Classes\Utils\StreamDataWriter.cs" />
<Compile Include="Classes\Models\DefaultModels\CharacterModel.cs" />
<Compile Include="Classes\Models\DefaultModels\ModelBase.cs" />
<Compile Include="Classes\Models\DefaultModels\Texture.cs" />