User:Shimmy/Variable-length quantity: Difference between revisions
Content deleted Content added
Created page with "<lang csharp>namespace Vlq { using System; using System.Collections.Generic; using System.Linq; public static class VarLenQuantity { public static ulong ToVlq(u..." |
mNo edit summary |
||
(One intermediate revision by the same user not shown) | |||
Line 1:
See the main code base on [[Variable-length_quantity#C#|Variable-length quantity]].
<lang csharp>namespace Vlq
{
using System;
using System.
public static class
{
/// <summary>
/// Reads a 7-bit encoded variable-length quantity from binary and return it as integer.
/// </summary>
/// <returns></returns>
public uint ReadVariableLengthQuantity(BinaryReader reader)
{
var
byte current;
throw new FormatException("Could not read variable-length quantity from provided stream.");
buffer <<= 7;
} while ((current & 0x80) != 0);
return buffer;
}
/// <summary>
/// Writes the specified integer as a 7-bit encoded variable-length quantity.
/// </summary>
/// <param name="integer"></param>
public void WriteVariableLengthQuantity(BinaryWriter writer, ulong integer)
{
if (integer > Math.Pow(2, 56))
throw new OverflowException("Integer exceeds max value.");
var index =
var significantBitReached = false;
var mask = 0x7fUL << (index * 7);
Line 41 ⟶ 52:
if (index > 0)
buffer |= 0x80;
}
mask >>= 7;
index--;
}
if (!significantBitReached && index < 0)
writer.Write(new byte());
}
}
}</lang>
|
Latest revision as of 02:03, 30 October 2014
See the main code base on Variable-length quantity.
<lang csharp>namespace Vlq {
using System; using System.IO;
public static class VariableLengthQuantity { /// <summary> /// Reads a 7-bit encoded variable-length quantity from binary and return it as integer. /// </summary> /// <returns></returns> public uint ReadVariableLengthQuantity(BinaryReader reader) { var index = 0; uint buffer = 0; byte current; do { if (index++ == 8) throw new FormatException("Could not read variable-length quantity from provided stream.");
buffer <<= 7;
current = reader.ReadByte(); buffer |= (current & 0x7FU); } while ((current & 0x80) != 0);
return buffer; }
/// <summary> /// Writes the specified integer as a 7-bit encoded variable-length quantity. /// </summary> /// <param name="integer"></param> public void WriteVariableLengthQuantity(BinaryWriter writer, ulong integer) { if (integer > Math.Pow(2, 56)) throw new OverflowException("Integer exceeds max value.");
var index = 3; var significantBitReached = false; var mask = 0x7fUL << (index * 7); while (index >= 0) { var buffer = (mask & integer); if (buffer > 0 || significantBitReached) { significantBitReached = true; buffer >>= index * 7; if (index > 0) buffer |= 0x80; writer.Write((byte)buffer); } mask >>= 7; index--; }
if (!significantBitReached && index < 0) writer.Write(new byte()); } }
}</lang>