コード例 #1
0
        /// <summary>
        /// Returns this instance of PK2Entry as byte[] which can be used to be written back to the PK2 archive
        /// </summary>
        /// <returns></returns>
        public byte[] ToByteArray()
        {
            var result = new byte[128];

            using (var stream = new StreamWorker(result, StreamOperation.Write))
            {
                stream.WriteByte(Type);
                stream.WriteString(Name);
                stream.WriteByteArray(new byte[81 - Name.Length]); //Write the name padding
                stream.WriteLong(AccessTime.Ticks);
                stream.WriteLong(CreateTime.Ticks);
                stream.WriteLong(ModifyTime.Ticks);
                stream.WriteULong(Position);
                stream.WriteUInt(Size);
                stream.WriteULong(NextChain);
                stream.WriteByteArray(new byte[2]); //Padding to reach 128 bytes length
            }

            //If we have an encypted archive we have to encrypt this, too
            if (BlowfishUtilities.GetBlowfish() != null)
            {
                result = BlowfishUtilities.GetBlowfish().Encode(result);
            }

            return(result);
        }
コード例 #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="PK2Entry" /> class.
        /// </summary>
        /// <param name="buffer">The buffer.</param>
        /// <param name="block">The block.</param>
        /// <param name="index">The index of the entry inside the block.</param>
        /// <exception cref="InvalidEntryException"></exception>
        public PK2Entry(byte[] buffer, PK2Block block, byte index)
        {
            Index = index;
            Block = block;

            using (var streamWorker = new StreamWorker(buffer, StreamOperation.Read))
            {
                try
                {
                    Type       = (PK2EntryType)streamWorker.ReadByte();
                    Name       = streamWorker.ReadString(81).Trim('\0');
                    AccessTime = DateTime.FromFileTimeUtc(streamWorker.ReadLong());
                    CreateTime = DateTime.FromFileTimeUtc(streamWorker.ReadLong());
                    ModifyTime = DateTime.FromFileTimeUtc(streamWorker.ReadLong());
                    Position   = streamWorker.ReadULong();
                    Size       = streamWorker.ReadUInt();
                    NextChain  = streamWorker.ReadULong();
                    streamWorker.ReadByteArray(2); //Padding to reach 128 bytes length
                }
                catch
                {
                    throw new InvalidEntryException(buffer);
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// To the byte array.
        /// </summary>
        /// <returns></returns>
        public byte[] ToByteArray()
        {
            var buffer = new byte[2560];

            using (var stream = new StreamWorker(buffer, StreamOperation.Write))
            {
                for (var i = 0; i < 20; i++)
                {
                    stream.WriteByteArray(Entries[i].ToByteArray());
                }
            }
            return(buffer);
        }
コード例 #4
0
ファイル: PK2Header.cs プロジェクト: x3nx1a/SlimPK2
 /// <summary>
 /// Initializes a new instance of the <see cref="PK2Header"/> class.
 /// </summary>
 /// <param name="buffer">The buffer.</param>
 /// <exception cref="SlimPK2.Types.InvalidHeaderException"></exception>
 public PK2Header(byte[] buffer)
 {
     using (var streamWorker = new StreamWorker(buffer, StreamOperation.Read))
     {
         try
         {
             Name             = streamWorker.ReadString(30).Trim('\0');
             Version          = streamWorker.ReadByteArray(4);
             Encrypted        = streamWorker.ReadBool();
             SecurityChecksum = streamWorker.ReadByteArray(16);
             UnkBytes         = streamWorker.ReadByteArray(205);
         }
         catch
         {
             throw new InvalidHeaderException();
         }
     }
 }
コード例 #5
0
        /// <summary>
        /// Creates a new block within the PK2.
        /// </summary>
        /// <param name="entries">The entries.</param>
        /// <returns></returns>
        /// <exception cref="PK2NotLoadedException"></exception>
        public static PK2Block Create(PK2Entry[] entries = null)
        {
            if (FileAdapter.GetInstance() == null)
            {
                throw new PK2NotLoadedException();
            }

            var buffer = new byte[2560];

            using (var stream = new StreamWorker(buffer, StreamOperation.Write))
            {
                for (var i = 0; i < 20; i++)
                {
                    stream.WriteByteArray(entries?[i] != null ? entries[i].ToByteArray() : new PK2Entry().ToByteArray());
                }
            }

            return(new PK2Block(buffer, (ulong)FileAdapter.GetInstance().AppendData(buffer)));
        }
コード例 #6
0
        /// <summary>
        /// Initializes a new instance of the <see cref="PK2Block" /> class.
        /// </summary>
        /// <param name="buffer">The buffer.</param>
        /// <param name="offset">The block offset.</param>
        public PK2Block(byte[] buffer, ulong offset)
        {
            Entries = new PK2Entry[20];
            Offset  = offset;

            using (var streamWorker = new StreamWorker(buffer, StreamOperation.Read))
            {
                for (var i = 0; i < 20; i++)
                {
                    var entryBuffer = streamWorker.ReadByteArray(128);

                    if (BlowfishUtilities.GetBlowfish() != null)
                    {
                        entryBuffer = BlowfishUtilities.GetBlowfish().Decode(entryBuffer);
                    }

                    Entries[i] = new PK2Entry(entryBuffer, this, (byte)i);
                }
            }
        }
コード例 #7
0
 /// <summary>
 /// 发送消息
 /// </summary>
 protected Task Send(TEvent content, StreamSequenceToken token = null)
 {
     return(StreamWorker.OnNextAsync(content, token));
 }