using System.Runtime.InteropServices;
public static void Main()
Console.WriteLine($"Converted back PointID: 0x{point:X}");
var register = GetRegisterFromPointId<uint>(point);
var point2 = GetPointIdFromRegister(register,64,11776);
Console.WriteLine($"Register: {register}");
Console.WriteLine($"Converted back PointID: 0x{point2:X}");
public static ushort GetRegisterFromPointId<T>(int pointId) where T : struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
return GetNumberOfWordsInValue<T>() switch
1 => GetRegisterFromPointId(pointId, 32, 3584),
2 => GetRegisterFromPointId(pointId, 64, 11776),
_ => throw new TypeLoadException("Incorrect integral numeric type.")
private static ushort GetRegisterFromPointId(int pointId, int factor, int shift)
var group = pointId >> 7;
var offset = pointId & 127;
return (ushort)(group * factor + shift + offset * (factor / 32));
public static ushort GetNumberOfWordsInValue<T>() where T : struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
return (ushort)(Marshal.SizeOf(default(T)) / 2);
private static int GetPointIdFromRegister(ushort register, int factor, int shift)
var adjustedValue = register - shift;
var group = adjustedValue / factor;
var offset = (adjustedValue % factor) / (factor / 32);
return (group << 7) + offset;