/// <summary> /// Reads a null-terminated string from the stream /// </summary> /// <param name="maxlen">Maximum number of bytes to read in</param> /// <returns>A string of maxlen or less</returns> public virtual string ReadString(int maxlen) { var buf = new byte[maxlen]; Read(buf, 0, maxlen); return(Marshal.ConvertToString(buf)); }
public override void ApplyToFieldInfo(FieldInfo Info, ISerializablePacket Packet, Type Field) { if (Field.Equals(typeof(byte[]))) { Info.SetValue(Packet, val); } else if (Field.Equals(typeof(string))) { Info.SetValue(Packet, Marshal.ConvertToString((byte[])val)); } }
public string GetString() { if (val is byte[]) { return(Marshal.ConvertToString(val as byte[])); } else if (val is string) { return((string)val); } return(""); }
/// <summary> /// Reads a new MPK header from a binary reader /// </summary> /// <param name="rdr">The binary reader pointing to the MPK header</param> public void Read(BinaryReader rdr) { var buf = new byte[256]; rdr.Read(buf, 0, 256); _name = Marshal.ConvertToString(buf); _timestamp = rdr.ReadUInt32(); _unk = rdr.ReadInt32(); _offset = rdr.ReadUInt32(); _uncompressedSize = rdr.ReadUInt32(); _directoryOffset = rdr.ReadUInt32(); _compressedSize = rdr.ReadUInt32(); _crc.Value = rdr.ReadUInt32(); }
/// <summary> /// Reads a MPK from a binary reader /// </summary> /// <param name="rdr">The binary reader pointing to the MPK</param> private void ReadArchive(BinaryReader rdr) { _files.Clear(); _crc.Value = 0; _sizeDir = 0; _sizeName = 0; _numFiles = 0; var buf = new byte[16]; rdr.Read(buf, 0, 16); for (byte i = 0; i < 16; ++i) { buf[i] ^= i; } _crc.Value = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; _sizeDir = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]; _sizeName = (buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | buf[11]; _numFiles = (buf[12] << 24) | (buf[13] << 16) | (buf[14] << 8) | buf[15]; buf = new byte[_sizeName]; rdr.Read(buf, 0, _sizeName); var inf = new Inflater(); inf.SetInput(buf); buf = new byte[1024]; inf.Inflate(buf); buf[inf.TotalOut] = 0; _name = Marshal.ConvertToString(buf); long totalin = 0; buf = ReadDirectory(rdr, ref totalin); using (var directory = new MemoryStream(buf)) { long pos = rdr.BaseStream.Position; long len = rdr.BaseStream.Seek(0, SeekOrigin.End); rdr.BaseStream.Position = pos; buf = new byte[len - pos]; rdr.Read(buf, 0, buf.Length); using (var files = new MemoryStream(buf)) { rdr.BaseStream.Position = pos - totalin; buf = new byte[totalin]; rdr.Read(buf, 0, buf.Length); var crc = new Crc32(); crc.Reset(); crc.Update(buf); if (crc.Value != _crc.Value) { throw new Exception("Invalid or corrupt MPK"); } while (directory.Position < directory.Length && files.Position < files.Length) { crc.Reset(); buf = new byte[MPKFileHeader.MaxSize]; directory.Read(buf, 0, MPKFileHeader.MaxSize); MPKFileHeader hdr; using (var hdrStream = new MemoryStream(buf)) { using (var hdrRdr = new BinaryReader(hdrStream, Encoding.UTF8)) { hdr = new MPKFileHeader(hdrRdr); } } var compbuf = new byte[hdr.CompressedSize]; files.Read(compbuf, 0, compbuf.Length); crc.Update(compbuf, 0, compbuf.Length); inf.Reset(); inf.SetInput(compbuf, 0, compbuf.Length); buf = new byte[hdr.UncompressedSize]; inf.Inflate(buf, 0, buf.Length); var file = new MPKFile(compbuf, buf, hdr); if (crc.Value != hdr.CRC.Value) { OnInvalidFile(file); continue; } _files.Add(hdr.Name.ToLower(), file); } } } }