public int Decode(ref byte *src, int lSrc, ref byte *dst, int lDst) { var start = dst; var data = (Int32Entry *)dst; var end = src + lSrc; while (src < end) { data->ticks = _minTicks + Codec.DecodeInt64(ref src); data->value = Codec.DecodeInt32(ref src, out var isNegative); if (isNegative) { data->value = -(_maxNegValue + data->value); } else { data->value += _minPosValue; } data++; } return((int)((byte *)data - start)); }
public void TestEncodeDecodeInt64() { const int factor = 10; var values = new long[64 * factor]; for (var i = 1; i < 64; i++) { var value = (long)Math.Pow(2, i); values[i * factor] = value - 2; values[i * factor + 1] = value - 1; values[i * factor + 2] = value; values[i * factor + 3] = value + 1; values[i * factor + 4] = value + 2; values[i * factor + 5] = -values[i * factor]; values[i * factor + 6] = -values[i * factor + 1]; values[i * factor + 7] = -values[i * factor + 2]; values[i * factor + 8] = -values[i * factor + 3]; values[i * factor + 9] = -values[i * factor + 4]; } var buffer = stackalloc byte[9]; for (var i = 0; i < values.Length; i++) { var p = buffer; Codec.EncodeInt64(values[i], ref p); p = buffer; var value = Codec.DecodeInt64(ref p); Assert.AreEqual(values[i], value, "At idx: " + i); } }
public int DecodeHead(ref byte *src, int len) { var start = src; _minTicks = Codec.DecodeInt64(ref src); _maxNegValue = Codec.DecodeInt32(ref src); _minPosValue = Codec.DecodeInt32(ref src); return((int)(src - start)); }
public static void DecodeMinDeltaU32(ref byte *src, int skip, byte *dst) { var len = *(int *)src; var end = src + len; src += sizeof(int); var next = sizeof(uint) + skip; *(long *)dst = Codec.DecodeInt64(ref src); var minDelta = Codec.DecodeInt64(ref src); dst += next; while (src < end) { *(long *)dst = *(long *)(dst - next) + minDelta + Codec.DecodeInt64(ref src); dst += next; } }