/// <summary> /// This method is used to deserialize the ExGuid basic object from the specified byte array and start index. /// </summary> /// <param name="byteArray">Specify the byte array.</param> /// <param name="startIndex">Specify the start index from the byte array.</param> /// <returns>Return the length in byte of the ExGuid basic object.</returns> protected override int DoDeserializeFromByteArray(byte[] byteArray, int startIndex) { using (BitReader bitReader = new BitReader(byteArray, startIndex)) { int numberOfContinousZeroBit = 0; while (numberOfContinousZeroBit < 8 && bitReader.MoveNext()) { if (bitReader.Current == false) { numberOfContinousZeroBit++; } else { break; } } switch (numberOfContinousZeroBit) { case 2: this.Value = bitReader.ReadUInt32(5); this.GUID = bitReader.ReadGuid(); this.Type = ExtendedGUID5BitUintType; return(17); case 5: this.Value = bitReader.ReadUInt32(10); this.GUID = bitReader.ReadGuid(); this.Type = ExtendedGUID10BitUintType; return(18); case 6: this.Value = bitReader.ReadUInt32(17); this.GUID = bitReader.ReadGuid(); this.Type = ExtendedGUID17BitUintType; return(19); case 7: this.Value = bitReader.ReadUInt32(32); this.GUID = bitReader.ReadGuid(); this.Type = ExtendedGUID32BitUintType; return(21); case 8: this.GUID = Guid.Empty; this.Type = ExtendedGUIDNullType; return(1); default: throw new InvalidOperationException("Failed to parse the ExGuid, the type value is unexpected"); } } }
/// <summary> /// This method is used to get the compressed size value from the data file signature. /// </summary> /// <param name="dataFileSignature">Specify the signature of the zip file content.</param> /// <returns>Return the compressed size value.</returns> private ulong GetCompressedSize(byte[] dataFileSignature) { using (BitReader reader = new BitReader(dataFileSignature, 0)) { reader.ReadUInt32(32); return(reader.ReadUInt64(64)); } }
/// <summary> /// This method is used to deserialize the StreamObjectHeaderEnd16bit basic object from the specified byte array and start index. /// </summary> /// <param name="byteArray">Specify the byte array.</param> /// <param name="startIndex">Specify the start index from the byte array.</param> /// <returns>Return the length in byte of the StreamObjectHeaderEnd16bit basic object.</returns> protected override int DoDeserializeFromByteArray(byte[] byteArray, int startIndex) { using (BitReader reader = new BitReader(byteArray, startIndex)) { int headerType = reader.ReadInt32(2); if (headerType != 0x3) { throw new InvalidOperationException(string.Format("Failed to get the StreamObjectHeaderEnd16bit header type value, expect value {0}, but actual value is {1}", 0x3, headerType)); } uint typeValue = reader.ReadUInt32(14); if (!Enum.IsDefined(typeof(StreamObjectTypeHeaderEnd), (int)typeValue)) { throw new InvalidOperationException(string.Format("Failed to get the StreamObjectHeaderEnd16bit type value, the value {0} is not defined", typeValue)); } this.Type = (StreamObjectTypeHeaderEnd)typeValue; return(2); } }