You've already forked sceWork
mirror of
https://github.com/lifebottle/sceWork.git
synced 2026-02-13 15:16:05 -08:00
565 lines
22 KiB
C#
565 lines
22 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
|
|
namespace StreamFAdd
|
|
{
|
|
public class StreamFunctionAdd
|
|
{
|
|
private Stream Source;
|
|
private ByteEncoding Encoding;
|
|
|
|
public long LengthStream
|
|
{
|
|
get => this.Source.Length;
|
|
set => this.Source.SetLength(value);
|
|
}
|
|
|
|
public long PositionStream
|
|
{
|
|
get => this.Source.Position;
|
|
set => this.Source.Position = value;
|
|
}
|
|
|
|
public Stream GetSource() => this.Source;
|
|
|
|
public StreamFunctionAdd(Stream source, ByteEncoding encoding = ByteEncoding.Little)
|
|
{
|
|
this.Source = source;
|
|
this.Encoding = encoding;
|
|
if (this.Encoding != ByteEncoding.Selected)
|
|
return;
|
|
this.Encoding = ByteEncoding.Little;
|
|
}
|
|
|
|
public StreamFunctionAdd(string FileName, ByteEncoding encoding = ByteEncoding.Little)
|
|
{
|
|
this.Source = (Stream)new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
|
|
this.Encoding = encoding;
|
|
if (this.Encoding != ByteEncoding.Selected)
|
|
return;
|
|
this.Encoding = ByteEncoding.Little;
|
|
}
|
|
|
|
public StreamFunctionAdd(ByteEncoding encoding = ByteEncoding.Little)
|
|
{
|
|
this.Source = (Stream)new MemoryStream();
|
|
this.Encoding = encoding;
|
|
if (this.Encoding != ByteEncoding.Selected)
|
|
return;
|
|
this.Encoding = ByteEncoding.Little;
|
|
}
|
|
|
|
public void ChangeByteEncoding(ByteEncoding encoding)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
return;
|
|
this.Encoding = encoding;
|
|
}
|
|
|
|
public void Dispose() => this.Source.Dispose();
|
|
|
|
public byte ReadByte()
|
|
{
|
|
int num = this.Source.ReadByte();
|
|
return num != -1 ? (byte)num : throw new EndOfStreamException("Stream end");
|
|
}
|
|
|
|
public byte[] ReadBytes(int count)
|
|
{
|
|
byte[] buffer = new byte[count];
|
|
this.Source.Read(buffer, 0, count);
|
|
return buffer;
|
|
}
|
|
|
|
public short ReadInt16(ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
short num = 0;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding == ByteEncoding.Big)
|
|
num = (short)((int)this.ReadByte() << 8 | (int)this.ReadByte());
|
|
}
|
|
else
|
|
num = (short)((int)this.ReadByte() | (int)this.ReadByte() << 8);
|
|
return num;
|
|
}
|
|
|
|
public ushort ReadUInt16(ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
ushort num = 0;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding == ByteEncoding.Big)
|
|
num = (ushort)((uint)this.ReadByte() << 8 | (uint)this.ReadByte());
|
|
}
|
|
else
|
|
num = (ushort)((uint)this.ReadByte() | (uint)this.ReadByte() << 8);
|
|
return num;
|
|
}
|
|
|
|
public uint ReadUInt24(ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
uint num = 0;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding == ByteEncoding.Big)
|
|
num = (uint)ReadByte() << 16 | (uint)ReadByte() << 8 | (uint)ReadByte();
|
|
}
|
|
else
|
|
num = (uint)ReadByte() | (uint)ReadByte() << 8 | (uint)ReadByte() << 16;
|
|
return num;
|
|
}
|
|
|
|
|
|
public int ReadInt32(ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
int num = 0;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding == ByteEncoding.Big)
|
|
num = (int)this.ReadByte() << 24 | (int)this.ReadByte() << 16 | (int)this.ReadByte() << 8 | (int)this.ReadByte();
|
|
}
|
|
else
|
|
num = (int)this.ReadByte() | (int)this.ReadByte() << 8 | (int)this.ReadByte() << 16 | (int)this.ReadByte() << 24;
|
|
return num;
|
|
}
|
|
|
|
public uint ReadUInt32(ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
uint num = 0;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding == ByteEncoding.Big)
|
|
num = (uint)((int)this.ReadByte() << 24 | (int)this.ReadByte() << 16 | (int)this.ReadByte() << 8) | (uint)this.ReadByte();
|
|
}
|
|
else
|
|
num = (uint)((int)this.ReadByte() | (int)this.ReadByte() << 8 | (int)this.ReadByte() << 16 | (int)this.ReadByte() << 24);
|
|
return num;
|
|
}
|
|
|
|
public long ReadInt64(ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
long num = 0;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding == ByteEncoding.Big)
|
|
num = (long)(this.ReadUInt32() << 24 | this.ReadUInt32());
|
|
}
|
|
else
|
|
num = (long)(this.ReadUInt32() | this.ReadUInt32() << 24);
|
|
return num;
|
|
}
|
|
|
|
public ulong ReadUInt64(ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
ulong num = ulong.MaxValue;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding == ByteEncoding.Big)
|
|
num = (ulong)(this.ReadUInt32() << 24 | this.ReadUInt32());
|
|
}
|
|
else
|
|
num = (ulong)(this.ReadUInt32() | this.ReadUInt32() << 24);
|
|
return num;
|
|
}
|
|
|
|
public float ReadFloat(ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
return BitConverter.ToSingle(BitConverter.GetBytes(this.ReadUInt32(encoding)), 0);
|
|
}
|
|
|
|
public float ReadFloatBR(ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
byte[] numArray = new BinaryReader(this.Source).ReadBytes(4);
|
|
if (encoding == ByteEncoding.Big)
|
|
{
|
|
byte num1 = numArray[0];
|
|
numArray[0] = numArray[3];
|
|
numArray[3] = num1;
|
|
byte num2 = numArray[1];
|
|
numArray[1] = numArray[2];
|
|
numArray[2] = num2;
|
|
}
|
|
return BitConverter.ToSingle(numArray, 0);
|
|
}
|
|
|
|
public void WriteByte(byte value) => this.Source.WriteByte(value);
|
|
|
|
public void WriteBytes(byte[] bytes) => this.Source.Write(bytes, 0, bytes.Length);
|
|
|
|
public void WriteBytes(List<byte> bytes)
|
|
{
|
|
if (bytes == null) return;
|
|
|
|
foreach (byte bt in bytes)
|
|
{
|
|
Source.WriteByte(bt);
|
|
}
|
|
}
|
|
|
|
public void WriteInt16(short value, ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding != ByteEncoding.Big)
|
|
return;
|
|
this.WriteByte((byte)((int)value >> 8 & (int)byte.MaxValue));
|
|
this.WriteByte((byte)((uint)value & (uint)byte.MaxValue));
|
|
}
|
|
else
|
|
{
|
|
this.WriteByte((byte)((uint)value & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)((int)value >> 8 & (int)byte.MaxValue));
|
|
}
|
|
}
|
|
|
|
public void WriteUInt16(ushort value, ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding != ByteEncoding.Big)
|
|
return;
|
|
this.WriteByte((byte)((int)value >> 8 & (int)byte.MaxValue));
|
|
this.WriteByte((byte)((uint)value & (uint)byte.MaxValue));
|
|
}
|
|
else
|
|
{
|
|
this.WriteByte((byte)((uint)value & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)((int)value >> 8 & (int)byte.MaxValue));
|
|
}
|
|
}
|
|
|
|
public void WriteUInt24(uint value, ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding != ByteEncoding.Big)
|
|
return;
|
|
this.WriteByte((byte)(value >> 16 & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 8 & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)(value & (uint)byte.MaxValue));
|
|
}
|
|
else
|
|
{
|
|
this.WriteByte((byte)(value & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 8 & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 16 & (uint)byte.MaxValue));
|
|
}
|
|
}
|
|
|
|
public void WriteInt32(int value, ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding != ByteEncoding.Big)
|
|
return;
|
|
this.WriteByte((byte)(value >> 24 & (int)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 16 & (int)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 8 & (int)byte.MaxValue));
|
|
this.WriteByte((byte)(value & (int)byte.MaxValue));
|
|
}
|
|
else
|
|
{
|
|
this.WriteByte((byte)(value & (int)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 8 & (int)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 16 & (int)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 24 & (int)byte.MaxValue));
|
|
}
|
|
}
|
|
|
|
public void WriteUInt32(uint value, ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding != ByteEncoding.Big)
|
|
return;
|
|
this.WriteByte((byte)(value >> 24 & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 16 & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 8 & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)(value & (uint)byte.MaxValue));
|
|
}
|
|
else
|
|
{
|
|
this.WriteByte((byte)(value & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 8 & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 16 & (uint)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 24 & (uint)byte.MaxValue));
|
|
}
|
|
}
|
|
|
|
public void WriteInt64(long value, ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding != ByteEncoding.Big)
|
|
return;
|
|
this.WriteByte((byte)((ulong)(value >> 56) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 48) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 40) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 32) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 24) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 16) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 8) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)value & (ulong)byte.MaxValue));
|
|
}
|
|
else
|
|
{
|
|
this.WriteByte((byte)((ulong)value & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 8) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 16) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 24) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 32) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 40) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 48) & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)((ulong)(value >> 56) & (ulong)byte.MaxValue));
|
|
}
|
|
}
|
|
|
|
public void WriteUInt64(ulong value, ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
if (encoding != ByteEncoding.Little)
|
|
{
|
|
if (encoding != ByteEncoding.Big)
|
|
return;
|
|
this.WriteByte((byte)(value >> 56 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 48 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 40 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 32 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 24 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 16 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 8 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value & (ulong)byte.MaxValue));
|
|
}
|
|
else
|
|
{
|
|
this.WriteByte((byte)(value & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 8 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 16 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 24 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 32 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 40 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 48 & (ulong)byte.MaxValue));
|
|
this.WriteByte((byte)(value >> 56 & (ulong)byte.MaxValue));
|
|
}
|
|
}
|
|
|
|
public void WriteFloat(float value, ByteEncoding encoding = ByteEncoding.Selected)
|
|
{
|
|
if (encoding == ByteEncoding.Selected)
|
|
encoding = this.Encoding;
|
|
this.WriteUInt32(BitConverter.ToUInt32(BitConverter.GetBytes(value), 0), encoding);
|
|
}
|
|
|
|
public void CopyPartFrom(Stream from, int size, int buffersize = 4096)
|
|
{
|
|
if (size <= 0)
|
|
throw new Exception("Block size = 0");
|
|
byte[] buffer = new byte[buffersize];
|
|
if (from.Position + (long)size > from.Length)
|
|
size = (int)(from.Length - from.Position);
|
|
int num = size;
|
|
int count1 = buffersize;
|
|
if (count1 > num)
|
|
count1 = num;
|
|
int count2;
|
|
while ((count2 = from.Read(buffer, 0, count1)) != 0)
|
|
{
|
|
this.Source.Write(buffer, 0, count2);
|
|
num -= count2;
|
|
if (count1 > num)
|
|
count1 = num;
|
|
}
|
|
}
|
|
|
|
public void CopyPartFrom(byte[] from, int size, int indx = 0, int buffersize = 4096)
|
|
{
|
|
if (size <= 0)
|
|
throw new Exception("Block size = 0");
|
|
if (indx + size > from.Length)
|
|
size = from.Length - indx;
|
|
int num = size;
|
|
int count = buffersize;
|
|
if (count > num)
|
|
count = num;
|
|
do
|
|
{
|
|
this.Source.Write(from, indx, count);
|
|
indx += count;
|
|
num -= count;
|
|
if (count > num)
|
|
count = num;
|
|
}
|
|
while (indx < from.Length);
|
|
}
|
|
|
|
public void CopyPartTo(Stream destination, int size, int buffersize = 4096)
|
|
{
|
|
if (size <= 0)
|
|
throw new Exception("Block size = 0");
|
|
byte[] buffer = new byte[buffersize];
|
|
if (this.Source.Position + (long)size > this.Source.Length)
|
|
size = (int)(this.Source.Length - this.Source.Position);
|
|
int num = size;
|
|
int count1 = buffersize;
|
|
if (count1 > num)
|
|
count1 = num;
|
|
int count2;
|
|
while ((count2 = this.Source.Read(buffer, 0, count1)) != 0)
|
|
{
|
|
destination.Write(buffer, 0, count2);
|
|
num -= count2;
|
|
if (count1 > num)
|
|
count1 = num;
|
|
}
|
|
}
|
|
|
|
public void CopyPartTo(byte[] destination, int size, int buffersize = 4096)
|
|
{
|
|
if (size <= 0)
|
|
throw new Exception("Block size = 0");
|
|
byte[] buffer = new byte[buffersize];
|
|
if (this.Source.Position + (long)size > this.Source.Length)
|
|
size = (int)(this.Source.Length - this.Source.Position);
|
|
int num = size;
|
|
int count = buffersize;
|
|
if (count > num)
|
|
count = num;
|
|
int destinationIndex = 0;
|
|
int length;
|
|
while ((length = this.Source.Read(buffer, 0, count)) != 0)
|
|
{
|
|
Array.Copy((Array)buffer, 0, (Array)destination, destinationIndex, length);
|
|
destinationIndex += length;
|
|
num -= length;
|
|
if (count > num)
|
|
count = num;
|
|
}
|
|
}
|
|
|
|
public void CopyPartTo(StreamFunctionAdd destination, int size, int buffersize = 4096) => this.CopyPartTo(destination.GetSource(), size, buffersize);
|
|
|
|
public string ReadAnsiStringStopByte(byte StopByte = 0, int codePage = 1252)
|
|
{
|
|
int count = 0;
|
|
long position = this.Source.Position;
|
|
while ((int)this.ReadByte() != (int)StopByte)
|
|
++count;
|
|
this.Source.Position = position;
|
|
byte[] numArray = new byte[count];
|
|
this.Source.Read(numArray, 0, count);
|
|
++this.Source.Position;
|
|
return System.Text.Encoding.GetEncoding(codePage).GetString(numArray, 0, count);
|
|
}
|
|
|
|
public string ReadAnsiStringSize(int size, int codePage = 1252)
|
|
{
|
|
byte[] numArray = new byte[size];
|
|
this.Source.Read(numArray, 0, size);
|
|
for (int index = 0; index < size; ++index)
|
|
{
|
|
if (numArray[index] == (byte)0)
|
|
size = index;
|
|
}
|
|
return System.Text.Encoding.GetEncoding(codePage).GetString(numArray, 0, size);
|
|
}
|
|
|
|
public string ReadUTF8StringStopByte(byte StopByte = 0)
|
|
{
|
|
int count = 0;
|
|
long position = this.Source.Position;
|
|
while ((int)this.ReadByte() != (int)StopByte)
|
|
++count;
|
|
this.Source.Position = position;
|
|
byte[] numArray = new byte[count];
|
|
this.Source.Read(numArray, 0, count);
|
|
++this.Source.Position;
|
|
return System.Text.Encoding.UTF8.GetString(numArray, 0, count);
|
|
}
|
|
|
|
public string ReadUTF8StringSize(int size)
|
|
{
|
|
byte[] numArray = new byte[size];
|
|
this.Source.Read(numArray, 0, size);
|
|
return System.Text.Encoding.UTF8.GetString(numArray, 0, size);
|
|
}
|
|
|
|
public void WriteAnsiStringStopByte(string str, byte stopByte = 0, int codePage = 1252)
|
|
{
|
|
System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(codePage);
|
|
int byteCount = encoding.GetByteCount(str);
|
|
this.Source.Write(encoding.GetBytes(str), 0, byteCount);
|
|
this.Source.WriteByte(stopByte);
|
|
}
|
|
|
|
public void WriteUTF8StringStopByte(string Str, byte StopByte = 0)
|
|
{
|
|
int byteCount = System.Text.Encoding.UTF8.GetByteCount(Str);
|
|
this.Source.Write(System.Text.Encoding.UTF8.GetBytes(Str), 0, byteCount);
|
|
this.Source.WriteByte(StopByte);
|
|
}
|
|
|
|
public void SeekValue(uint value)
|
|
{
|
|
while (this.Source.Position % (long)value != 0L)
|
|
++this.Source.Position;
|
|
}
|
|
|
|
public void SeekValueWrite(uint value)
|
|
{
|
|
while (this.Source.Position % (long)value != 0L)
|
|
this.Source.WriteByte((byte)0);
|
|
}
|
|
|
|
public void SeekValueWrite(uint value, byte writeByte)
|
|
{
|
|
while (this.Source.Position % (long)value != 0L)
|
|
this.Source.WriteByte(writeByte);
|
|
}
|
|
|
|
public void SetPosition(long offset) => this.Source.Position = offset;
|
|
|
|
public long GetPosition() => this.Source.Position;
|
|
|
|
public void SaveToFile(string FileName)
|
|
{
|
|
using (FileStream fileStream = new FileStream(FileName, FileMode.Create))
|
|
{
|
|
this.Source.Position = 0L;
|
|
this.CopyPartTo((Stream)fileStream, (int)this.Source.Length);
|
|
}
|
|
}
|
|
}
|
|
} |