コード例 #1
0
        /// <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));
        }
コード例 #2
0
ファイル: ArrayBit.cs プロジェクト: dsstest/SiennaCore
 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));
     }
 }
コード例 #3
0
        public string GetString()
        {
            if (val is byte[])
            {
                return(Marshal.ConvertToString(val as byte[]));
            }
            else if (val is string)
            {
                return((string)val);
            }

            return("");
        }
コード例 #4
0
ファイル: MPKFileHeader.cs プロジェクト: mywebext/DOL
        /// <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();
        }
コード例 #5
0
        /// <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);
                    }
                }
            }
        }