VLQ Parser

Run Settings
LanguageC#
Language Version
Run Command
using System; using System.Text; using System.Collections.Generic; /* TO USE - enter a comma-delimited sequence of bytes into the Stdin section below and then press RUN. */ class MainClass { static void Main() { int[] ints = CreateIntegerArray(); { var tuple = ints.ParseVlq(); Console.WriteLine("Parse unsigned: {0}, Rest of VQL: {1}", tuple.Item1, tuple.Item2); } { var tuple = ints.ParseSignedVlq(); Console.WriteLine("Parse signed: {0}, Rest of VQL: {1}", tuple.Item1, tuple.Item2); } { var tuple = ints.ParseStupidStarboundSignedVlq(); Console.WriteLine("Parse stupid starbound signed: {0}, Rest of VQL: {1}", tuple.Item1, tuple.Item2); } } static int[] CreateIntegerArray() { string[] x = Console.ReadLine().Split(','); List<int> list = new List<int>(); foreach(string s in x) { list.Add(Convert.ToInt32(s.Trim())); } return list.ToArray(); } } static class IntArrayExtensions { public static Tuple<ulong, int[]> ParseVlq(this int[] ints) { ulong ret = 0; int[] rest = null; for(int index = 0; index < ints.Length; ++index) { ret = ret << 7; ret += (ulong)(ints[index] & 0x7F); if ((ints[index] & 0x80) == 0 && index + 1 < ints.Length) { rest = new int[ints.Length - index - 1]; Array.Copy(ints, index + 1, rest, 0, rest.Length); break; } } return Tuple.Create(ret, rest); } public static Tuple<long, int[]> ParseSignedVlq(this int[] ints) { long ret = 0; int[] rest = null; int negative = 1; for (int index = 0; index < ints.Length; ++index) { if (index == 0) { ret = ret << 6; ret += (long)(ints[index] & 0x3F); if ((ints[index] & 0x40) == 1) { negative = -1; } } else { ret = ret << 7; ret += (long)(ints[index] & 0x7F); } if ((ints[index] & 0x80) == 0 && index + 1 < ints.Length) { rest = new int[ints.Length - index - 1]; Array.Copy(ints, index + 1, rest, 0, rest.Length); break; } } return Tuple.Create((ret * negative), rest); } public static Tuple<long, int[]> ParseStupidStarboundSignedVlq(this int[] ints) { var tuple = ints.ParseVlq(); long ret = (long)(tuple.Item1 >> 1); if((tuple.Item1 & 1) != 0) { ret *= -1; ret += -1; } return Tuple.Create(ret, tuple.Item2); } public static string ToCommaList(this int[] ints) { StringBuilder str = new StringBuilder(); foreach(int i in ints ?? new int[] { }) { if(str.Length == 0) { str.AppendFormat("{0}", i); } else { str.AppendFormat(", {0}", i); } } return str.ToString(); } }
Editor Settings
Theme
Key bindings
Full width
Lines