internal int GetLength(DnsDomainNameCompressionData compressionData, int offsetInDns) { int length = 0; for (int i = 0; i != LabelsCount; ++i) { ListSegment <DataSegment> labels = new ListSegment <DataSegment>(_labels, i); if (compressionData.IsAvailable(labels)) { return(length + sizeof(ushort)); } compressionData.AddCompressionData(labels, offsetInDns + length); length += sizeof(byte) + labels[0].Length; } return(length + sizeof(byte)); }
internal int Write(byte[] buffer, int dnsOffset, DnsDomainNameCompressionData compressionData, int offsetInDns) { int length = 0; for (int i = 0; i != LabelsCount; ++i) { ListSegment <DataSegment> labels = new ListSegment <DataSegment>(_labels, i); int pointerOffset; if (compressionData.TryGetOffset(labels, out pointerOffset)) { buffer.Write(dnsOffset + offsetInDns + length, (ushort)(CompressionMarker | (ushort)pointerOffset), Endianity.Big); return(length + sizeof(ushort)); } DataSegment currentLabel = labels[0]; compressionData.AddCompressionData(labels, offsetInDns + length); buffer.Write(dnsOffset + offsetInDns + length, (byte)currentLabel.Length); length += sizeof(byte); currentLabel.Write(buffer, dnsOffset + offsetInDns + length); length += currentLabel.Length; } return(length + sizeof(byte)); }