/// <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); }
/// <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); } } }
/// <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); }
/// <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(); } } }
/// <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))); }
/// <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); } } }
/// <summary> /// 发送消息 /// </summary> protected Task Send(TEvent content, StreamSequenceToken token = null) { return(StreamWorker.OnNextAsync(content, token)); }