public uint UnpackInt(PropertyInfo info, Bitstream stream) { var flags = info.Flags; if (flags.HasFlag(PropertyInfo.MultiFlag.EncodedAgainstTickcount)) { if (flags.HasFlag(PropertyInfo.MultiFlag.Unsigned)) { return stream.ReadVarUInt(); } var value = stream.ReadVarUInt(); return unchecked((uint) ((-(value & 1)) ^ (value >> 1))); } var numBits = info.NumBits; var isUnsigned = Convert.ToUInt32(flags.HasFlag(PropertyInfo.MultiFlag.Unsigned)); var signer = (0x80000000 >> (32 - numBits)) & unchecked((isUnsigned - 1)); { var value = stream.ReadBits(numBits) ^ signer; return value - signer; } }
public ulong UnpackInt64(PropertyInfo info, Bitstream stream) { if (info.Flags.HasFlag(PropertyInfo.MultiFlag.EncodedAgainstTickcount)) { return stream.ReadVarUInt(); } var negate = false; var secondBits = (byte) (info.NumBits - 32); if (!info.Flags.HasFlag(PropertyInfo.MultiFlag.Unsigned)) { --secondBits; if (stream.ReadBool()) { negate = true; } } ulong a = stream.ReadBits(32); ulong b = stream.ReadBits(secondBits); var value = (b << 32) | a; if (negate) { value = unchecked((ulong) ((long) value*-1)); } return value; }
private uint ReadFieldNumber(uint lastField, Bitstream stream) { if (stream.ReadBool()) { return unchecked(lastField + 1); } var value = stream.ReadVarUInt(); if (value == 0x3FFF) { return uint.MaxValue; } return unchecked(lastField + value + 1); }