public static void WriteValueString(WritableBuffer buffer, string value, HeaderOptions options) { switch (options & HeaderOptions.ValueCompressionMask) { case HeaderOptions.ValueCompressionAutomatic: var len = HuffmanCode.GetByteCount(value); if (len < value.Length) { WriteUInt32(buffer, (uint)len, 0x80, 7); HuffmanCode.Write(buffer, value); } else { WriteUInt32(buffer, (uint)value.Length, 0, 7); buffer.WriteAsciiString(value); } break; case HeaderOptions.ValueCompressionOn: len = HuffmanCode.GetByteCount(value); WriteUInt32(buffer, (uint)len, 0x80, 7); HuffmanCode.Write(buffer, value); break; case HeaderOptions.ValueCompressionOff: WriteUInt32(buffer, (uint)value.Length, 0, 7); buffer.WriteAsciiString(value); break; default: throw new InvalidOperationException("Invalid value compression: " + options); } }
public static string ReadString(ref ReadableBuffer buffer, out bool compressed) { int header = buffer.Peek(); if (header < 0) { ThrowEndOfStreamException(); } compressed = (header & 0x80) != 0; buffer = buffer.Slice(1); int len = checked ((int)ReadUInt64(ref buffer, header, 7)); string result; if (compressed) { result = HuffmanCode.ReadString(buffer.Slice(0, len)); } else { result = buffer.Slice(0, len).GetAsciiString(); } buffer = buffer.Slice(len); return(result); }
private static unsafe string ReadString(ReadableBuffer buffer, char *c, int maxLen) { var reader = new HuffmanCode(buffer); for (int i = 0; i < maxLen; i++) { int next = reader.ReadNext(); if (next < 0) { return(i == 0 ? "" : new string(c, 0, i)); } c[i] = (char)next; } if (reader.ReadNext() < 0) { return(new string(c, 0, maxLen)); } throw new EndOfStreamException(); }