internal static string ToHex(int n) {
if (n < 0x10000)
return "<" + System.Convert.ToString(n, 16).PadLeft(4, '0') + ">";
n -= 0x10000;
int high = (n / 0x400) + 0xd800;
int low = (n % 0x400) + 0xdc00;
return "[<" + System.Convert.ToString(high, 16).PadLeft(4, '0') + System.Convert.ToString(low, 16).PadLeft(4, '0') + ">]";
}