/// <summary> /// Writes the header of the file with the writer. /// </summary> /// <param name="writer"> The writer. </param> /// <param name="entry"> The entry. </param> /// <param name="isCentralFileHeader"> Determines whether header is central file header or not (local). </param> private void WriteFileHeader(IByteArrayWriter writer, ZipWriteOnlyStorerEntry entry, bool isCentralFileHeader) { if (isCentralFileHeader) { writer.WriteBytes(centralDirectoryFileHeaderSignatureBytes); // 4 bytes, central directory file header signature writer.WriteBytes(23, 0xB); // 2 bytes, version made by } else { writer.WriteBytes(localFileHeaderSignatureBytes); // 4 bytes, local file header signature } writer.WriteBytes(versionToExtractBytes); // 2 bytes, version needed to extract (minimum) writer.WriteBytes(gpbg8Bytes); // 2 bytes, general purpose bit flag writer.WriteBytes(entry.CompressionMethodAsBytes); // 2 bytes, compression method writer.WriteBytes(entry.ModifyTimeAsBytes); // 2+2 bytes, file last modification time and date writer.WriteBytes(entry.CRC32AsBytes); // 4 bytes, CRC-32 writer.WriteBytes(entry.CompressedSizeAsBytes); // 4 bytes, compressed size writer.WriteBytes(entry.SizeAsBytes); // 4 bytes, uncompressed size writer.WriteBytes(entry.PathLengthAsBytes); // 2 bytes, file name length if (this.isZip64) { writer.WriteBytes(thirtyTwo2Bytes); // 2 bytes, extra field length = 32 } else { writer.WriteBytes(zero2Bytes); // 2 bytes, extra field length = 32 } if (isCentralFileHeader) { writer.WriteBytes(entry.CommentLengthAsBytes); // 2 bytes, file comment length writer.WriteBytes(zero4Bytes); // 2+2=4 bytes, disk number where file starts (disk=0), internal file attributes writer.WriteBytes(externalAttributesBytes); // 4 bytes, External file attributes writer.WriteBytes(entry.HeaderOffsetAsBytes); // 4 bytes, relative offset of header } writer.WriteBytes(entry.PathAsBytes); // variable size, file name if (this.isZip64) { writer.WriteBytes(zip64ExtraBlockTagSignatureBytes); // 2 bytes, tag for the extra block (ZIP64 Extended Information Extra Field) writer.WriteBytes(thirtyTwo2Bytes); // 2 bytes, size of the extra block writer.WriteBytes(zero4Bytes); writer.WriteBytes(entry.SizeZip64AsBytes); // 8 bytes, uncompressed size writer.WriteBytes(zero4Bytes); writer.WriteBytes(entry.CompressedSizeZip64AsBytes); // 8 bytes, compressed size writer.WriteBytes(zero4Bytes); writer.WriteBytes(entry.HeaderOffsetZip64AsBytes); // 8 bytes, compressed size writer.WriteBytes(zero4Bytes); // 4 bytes, disk number where file starts (disk=0) } if (isCentralFileHeader) { writer.WriteBytes(entry.CommentAsBytes); // variable size, file comment } }
public void Code(IByteArrayWriter writer, ref object value) { MessageBase valueEx = value as MessageBase; if (valueEx == null) { throw new NullReferenceException("转换为空"); } valueEx.PackMsg(writer); }
/// <summary> /// 写入消息包 /// </summary> /// <param name="writer"></param> public virtual void PackMsg(IByteArrayWriter writer) { }
public void Code(IByteArrayWriter writer, ref object value) { writer.WriteI32((Int32)value); }
public void Code(IByteArrayWriter writer, ref object value) { writer.WriteU32((uint)value); }
/// <summary> /// Writes the array of the bytes with the <see cref="IByteArrayWriter"></see>. /// </summary> /// <param name="writer"> The writer. </param> /// <param name="data"> Array of the bytes. </param> public static void WriteBytes(this IByteArrayWriter writer, params byte[] data) { writer.WriteBytes(data, 0, data.Length); }