public void EncodeSensitive(string name, string value, byte[] buffer, ref int offset, ref int bytesAvailableInBuffer) { if (name == null) { throw new ArgumentNullException(nameof(name)); } var header = GetIndexedHeader(name, value); if (header != null && header.Name.Length >= _maxDynamicTableSize) { header = null; } //Literal Header Field Never Indexed — Indexed Name if (header != null) { var indexOffset = offset; IntegerCodec.Encode(4, header.IndexPosition, buffer, ref offset, ref bytesAvailableInBuffer); buffer[indexOffset] += 8; } //Literal Header Field Never Indexed — New Name else { buffer[offset++] = 8; bytesAvailableInBuffer--; EncodeLiteral(name, buffer, ref offset, ref bytesAvailableInBuffer); } EncodeLiteral(value, buffer, ref offset, ref bytesAvailableInBuffer); }
private void EncodeLiteral(string literalValue, byte[] buffer, ref int offset, ref int bytesAvailableInBuffer) { var buf = _encoding.GetBytes(literalValue); var octets = _encoder.GetEncodedLength(buf); var huffmanOffset = offset; IntegerCodec.Encode(7, octets, buffer, ref offset, ref bytesAvailableInBuffer); buffer[huffmanOffset] += 128; _encoder.Encode(buf, 0, buf.Length, buffer, ref offset, ref bytesAvailableInBuffer); }
public void TestGetSignedIntegerSize() { Assert.AreEqual(1, IntegerCodec.GetSignedIntegerSize(63)); Assert.AreEqual(1, IntegerCodec.GetSignedIntegerSize(-64)); Assert.AreEqual(2, IntegerCodec.GetSignedIntegerSize(64)); Assert.AreEqual(2, IntegerCodec.GetSignedIntegerSize(8191)); Assert.AreEqual(2, IntegerCodec.GetSignedIntegerSize(-8192)); Assert.AreEqual(2, IntegerCodec.GetSignedIntegerSize(-65)); Assert.AreEqual(4, IntegerCodec.GetSignedIntegerSize(134217727)); Assert.AreEqual(4, IntegerCodec.GetSignedIntegerSize(-134217728)); }
public void should_be_able_to_decode_10_using_5bit_prefix_as_in_the_specification_example() { var expected = 10; var buffer = new byte[10]; var count = buffer.Length; var offset = 0; IntegerCodec.Encode(5, 10, buffer, ref offset, ref count); count = offset; offset = 0; var actual = IntegerCodec.Decode(5, buffer, ref offset, ref count); actual.Should().Be(expected); }
public void Encode(string name, string value, byte[] buffer, ref int offset, ref int bytesAvailableInBuffer) { if (name == null) { throw new ArgumentNullException(nameof(name)); } var header = GetIndexedHeader(name, value); if (header != null && header.Name.Length >= _maxDynamicTableSize) { header = null; } if (header != null && header.Value.Equals(value)) { var flagOffset = offset; IntegerCodec.Encode(7, header.IndexPosition, buffer, ref offset, ref bytesAvailableInBuffer); buffer[flagOffset] += 128; return; } //Literal Header Field with Incremental Indexing — New Name if (header == null) { buffer[offset++] = 64; bytesAvailableInBuffer -= 1; _dynamicTable.Append(name, value); EncodeLiteral(name, buffer, ref offset, ref bytesAvailableInBuffer); } else { var flagOffset = offset; IntegerCodec.Encode(6, header.IndexPosition, buffer, ref offset, ref bytesAvailableInBuffer); buffer[flagOffset] += 64; } EncodeLiteral(value, buffer, ref offset, ref bytesAvailableInBuffer); }