namespace MainLib
{
/// <summary>
/// Coverts base data types to an array of bytes, and an array of bytes to base data types using the big-endian format.
/// </summary>
public static class Convert
{
public static byte[] GetBytes(short value)
{
return (byte[])BitConverter.GetBytes(value).Reverse<byte>();
}
public static byte[] GetBytes(int value)
{
return (byte[])BitConverter.GetBytes(value).Reverse<byte>();
}
public static byte[] GetBytes(float value)
{
return (byte[])BitConverter.GetBytes(value).Reverse<byte>();
}
public static byte[] GetBytes(string value, int length)
{
byte[] temp = (byte[])value.Cast<byte>();
Array.Resize<byte>(ref temp, length);
return temp;
}
public static short ToInt16(byte[] value)
{
return BitConverter.ToInt16((byte[])value.Reverse<byte>(), 0);
}
public static int ToInt32(byte[] value)
{
return BitConverter.ToInt32((byte[])value.Reverse<byte>(), 0);
}
public static float ToSingle(byte[] value)
{
return BitConverter.ToSingle((byte[])value.Reverse<byte>(), 0);
}
public static string ToString(byte[] value, int length)
{
return new string((char[])value.Cast<char>().Take<char>(length));
}
}
public static class Tools
{
public static void PutBytes(byte[] destination, int index, short value)
{
Array.ConstrainedCopy(Convert.GetBytes(value), 0, destination, index, 2);
}
public static void PutBytes(byte[] destination, int index, int value)
{
Array.ConstrainedCopy(Convert.GetBytes(value), 0, destination, index, 4);
}
public static void PutBytes(byte[] destination, int index, float value)
{
Array.ConstrainedCopy(Convert.GetBytes(value), 0, destination, index, 4);
}
public static void PutBytes(byte[] destination, int index, string value, int length)
{
Array.ConstrainedCopy(Convert.GetBytes(value, length), 0, destination, index, 2);
}
public static short TakeInt16(byte[] source, int index)
{
byte[] temp = new byte[2];
Array.ConstrainedCopy(source, index, temp, 0, 2);
return Convert.ToInt16(temp);
}
public static int TakeInt32(byte[] source, int index)
{
byte[] temp = new byte[4];
Array.ConstrainedCopy(source, index, temp, 0, 4);
return Convert.ToInt32(temp);
}
public static float TakeSingle(byte[] source, int index)
{
byte[] temp = new byte[4];
Array.ConstrainedCopy(source, index, temp, 0, 4);
return Convert.ToSingle(temp);
}
public static string TakeString(byte[] source, int index, int length)
{
byte[] temp = new byte[length];
Array.ConstrainedCopy(source, index, temp, 0, length);
return Convert.ToString(temp, length);
}
}
}
namespace MainLib.StructuredBinaries
{
public delegate void ObjSetDelegate(object value);
public delegate void StrSetDelegate(string value);
public delegate object ObjGetDelegate();
public delegate string StrGetDelegate();
public interface IFieldFormat
{
string Name { get; }
int Index { get; }
ObjSetDelegate GetObjGetDelegate(List<byte[]> data, int YIndex);
StrSetDelegate GetStrGetDelegate(List<byte[]> data, int YIndex);
ObjGetDelegate GetObjSetDelegate(List<byte[]> data, int YIndex);
StrGetDelegate GetStrSetDelegate(List<byte[]> data, int YIndex);
}
public abstract class Bool8Field : IFieldFormat
{
public virtual string Name { get { return "A bool"; } }
public virtual int Index { get { return 0; } }
public ObjSetDelegate GetObjSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(object value) { data[YIndex][Index] = ((bool)value) ? (byte)1 : (byte)0; };
}
public StrSetDelegate GetStrSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(string value) { data[YIndex][Index] = (bool.Parse(value)) ? (byte)1 : (byte)0; };
}
public ObjGetDelegate GetObjGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return (data[YIndex][Index] == 1) ? true : false; };
}
public StrGetDelegate GetStrGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return (data[YIndex][Index] == 1) ? true.ToString() : false.ToString(); };
}
}
public abstract class SInt8Field : IFieldFormat
{
public virtual string Name { get { return "A 8bit signed integer"; } }
public virtual int Index { get { return 0; } }
public ObjSetDelegate GetObjSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(object value) { data[YIndex][Index] = (byte)value; };
}
public StrSetDelegate GetStrSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(string value) { data[YIndex][Index] = (byte)sbyte.Parse(value); };
}
public ObjGetDelegate GetObjGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return data[YIndex][Index]; };
}
public StrGetDelegate GetStrGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return ((sbyte)data[YIndex][Index]).ToString(); };
}
}
public abstract class UInt8Field : IFieldFormat
{
public virtual string Name { get { return "A 8bit unsigned integer"; } }
public virtual int Index { get { return 0; } }
public ObjSetDelegate GetObjSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(object value) { data[YIndex][Index] = (byte)value; };
}
public StrSetDelegate GetStrSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(string value) { data[YIndex][Index] = byte.Parse(value); };
}
public ObjGetDelegate GetObjGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return data[YIndex][Index]; };
}
public StrGetDelegate GetStrGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return ((byte)data[YIndex][Index]).ToString(); };
}
}
public abstract class SInt16Field : IFieldFormat
{
public virtual string Name { get { return "A 16bit signed integer"; } }
public virtual int Index { get { return 0; } }
public ObjSetDelegate GetObjSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(object value) { Tools.PutBytes(data[YIndex], Index, (short)value); };
}
public StrSetDelegate GetStrSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(string value) { Tools.PutBytes(data[YIndex], Index, short.Parse(value)); };
}
public ObjGetDelegate GetObjGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return Tools.TakeInt16(data[YIndex], Index); };
}
public StrGetDelegate GetStrGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return ((short)Tools.TakeInt16(data[YIndex], Index)).ToString(); };
}
}
public abstract class UInt16Field : IFieldFormat
{
public virtual string Name { get { return "A 16bit unsigned integer"; } }
public virtual int Index { get { return 0; } }
public ObjSetDelegate GetObjSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(object value) { Tools.PutBytes(data[YIndex], Index, (ushort)value); };
}
public StrSetDelegate GetStrSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(string value) { Tools.PutBytes(data[YIndex], Index, ushort.Parse(value)); };
}
public ObjGetDelegate GetObjGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return (ushort)Tools.TakeInt16(data[YIndex], Index); };
}
public StrGetDelegate GetStrGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return ((ushort)Tools.TakeInt16(data[YIndex], Index)).ToString(); };
}
}
public abstract class SInt32Field : IFieldFormat
{
public virtual string Name { get { return "A 32bit signed integer"; } }
public virtual int Index { get { return 0; } }
public ObjSetDelegate GetObjSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(object value) { Tools.PutBytes(data[YIndex], Index, (int)value); };
}
public StrSetDelegate GetStrSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(string value) { Tools.PutBytes(data[YIndex], Index, int.Parse(value)); };
}
public ObjGetDelegate GetObjGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return Tools.TakeInt32(data[YIndex], Index); };
}
public StrGetDelegate GetStrGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return ((int)Tools.TakeInt32(data[YIndex], Index)).ToString(); };
}
}
public abstract class UInt32Field : IFieldFormat
{
public virtual string Name { get { return "A 32bit unsigned integer"; } }
public virtual int Index { get { return 0; } }
public ObjSetDelegate GetObjSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(object value) { Tools.PutBytes(data[YIndex], Index, (uint)value); };
}
public StrSetDelegate GetStrSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(string value) { Tools.PutBytes(data[YIndex], Index, uint.Parse(value)); };
}
public ObjGetDelegate GetObjGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return (uint)Tools.TakeInt32(data[YIndex], Index); };
}
public StrGetDelegate GetStrGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return ((uint)Tools.TakeInt32(data[YIndex], Index)).ToString(); };
}
}
public abstract class SingleField : IFieldFormat
{
public virtual string Name { get { return "A float"; } }
public virtual int Index { get { return 0; } }
public ObjSetDelegate GetObjSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(object value) { Tools.PutBytes(data[YIndex], Index, (float)value); };
}
public StrSetDelegate GetStrSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(string value) { Tools.PutBytes(data[YIndex], Index, float.Parse(value)); };
}
public ObjGetDelegate GetObjGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return Tools.TakeSingle(data[YIndex], Index); };
}
public StrGetDelegate GetStrGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return ((float)Tools.TakeSingle(data[YIndex], Index)).ToString(); };
}
}
public abstract class StringField : IFieldFormat
{
public virtual string Name { get { return "A fixed string"; } }
public virtual int Index { get { return 0; } }
public virtual int Size { get { return 0; } }
public ObjSetDelegate GetObjSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(object value) { Tools.PutBytes(data[YIndex], Index, (string)value, Size); };
}
public StrSetDelegate GetStrSetDelegate(List<byte[]> data, int YIndex)
{
return delegate(string value) { Tools.PutBytes(data[YIndex], Index, value, Size); };
}
public ObjGetDelegate GetObjGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return Tools.TakeString(data[YIndex], Index, Size); };
}
public StrGetDelegate GetStrGetDelegate(List<byte[]> data, int YIndex)
{
return delegate() { return Tools.TakeString(data[YIndex], Index, Size); };
}
}
public interface ITableFormat
{
Table Parent { get; set; }
string Name { get; }
IFieldFormat[] Fields { get; }
int RecordLength { get; }
}
public class Table
{
public List<byte[]> Data;
public ITableFormat Format;
public int XDimension
{
get
{
return Format.RecordLength;
}
}
public int YDimension
{
get
{
return Data.Count;
}
}
public int Size
{
get
{
return XDimension * YDimension;
}
}
public byte[] Bytes
{
set
{
if ((value.Length % XDimension) != 0) throw new ArgumentException("Invalid data for the " + Format.Name + " table");
byte[] temp = new byte[XDimension];
Data = new List<byte[]>();
for (int i = 0; i < (value.Length / XDimension); i++)
{
Array.ConstrainedCopy(value, i * XDimension, temp, 0, XDimension);
Data.Add(temp);
}
}
get
{
byte[] temp = new byte[XDimension * YDimension];
for (int i = 0; i < YDimension; i++) Array.ConstrainedCopy(Data[i], 0, temp, i * XDimension, XDimension);
return temp;
}
}
public object this[int YIndex, int XIndex]
{
get
{
return Format.Fields[XIndex].GetObjSetDelegate(Data, YIndex)();
}
set
{
Format.Fields[XIndex].GetObjGetDelegate(Data, YIndex)(value);
}
}
public Table(ITableFormat format)
{
Format = format;
}
public Table(ITableFormat format, byte[] data)
{
Format = format;
Bytes = data;
}
}
}
namespace MainLib.StructuredBinaries.Omi.Ep33
{
public class ItemsTable : ITableFormat
{
private class UniqueField : UInt32Field
{
public override string Name
{
get
{
return "Unique Number";
}
}
public override int Index
{
get
{
return 0;
}
}
}
private class NameField : StringField
{
public override string Name
{
get
{
return "Name";
}
}
public override int Index
{
get
{
return 5;
}
}
public override int Size
{
get
{
return 43;
}
}
}
public override Table Parent { get { return null; } }
public override string Name { get { return "Items Table"; } }
public static IFieldFormat[] Fields { get { return new IFieldFormat[] { new UniqueField(), new NameField() }; } }
public override int RecordLength { get { return 456; } }
}
}