public void WriteIdentifier(Mpd.Generic.IO.FileDataIO pFile, bool bKadExcludeMD4) { uint uIncludesMD4 = bKadExcludeMD4 ? (uint)0 : (uint)1; // This is (currently) mandatory except for Kad uint uIncludesSize = (FileSize != 0) ? (uint)1 : (uint)0; uint uIncludesAICH = HasAICHHash ? (uint)1 : 0; uint uMandatoryOptions = 0; // RESERVED - Identifier invalid if we encounter unknown options uint uOptions = 0; // RESERVED byte byIdentifierDesc = (byte) ((uOptions << 5) | (uMandatoryOptions << 3) | (uIncludesAICH << 2) | (uIncludesSize << 1) | (uIncludesMD4 << 0)); pFile.WriteUInt8(byIdentifierDesc); if (!bKadExcludeMD4) { pFile.WriteHash16(md4Hash_); } if (FileSize != (ulong)0) { pFile.WriteUInt64(FileSize); } if (HasAICHHash) { aichHash_.Write(pFile); } }
public void WriteHashSetsToPacket(Mpd.Generic.IO.FileDataIO pFile, bool bMD4, bool bAICH) { // 6 Options - RESERVED // 1 AICH HashSet // 1 MD4 HashSet byte byOptions = 0; if (bMD4) { if (TheoreticalMD4PartHashCount == 0) { bMD4 = false; } else if (HasExpectedMD4HashCount) { byOptions |= 0x01; } else { bMD4 = false; } } if (bAICH) { if (TheoreticalAICHPartHashCount == 0) { bAICH = false; } else if (HasExpectedAICHHashCount && HasAICHHash) { byOptions |= 0x02; } else { bAICH = false; } } pFile.WriteUInt8(byOptions); if (bMD4) { WriteMD4HashsetToFile(pFile); } if (bAICH) { WriteAICHHashsetToFile(pFile); } }