为了在使用协议缓冲区传递UUID时保存空间,我们使用MSB/LSB表示法(两个64位long
值)发送它们。
message Uuid {
sfixed64 msb = 1;
sfixed64 lsb = 2;
}
在Java中很容易进入和退出它们,
UUID id = UUID.fromString("eb66c416-4739-465b-9af3-9dc33ed8eef9");
long msb = id.getMostSignificantBits();
long lsb = id.getLeastSignificantBits();
System.out.println(msb + ", " + lsb);
// -1484283427208739237, -7281302710629372167
System.out.println(new UUID(msb, lsb));
// eb66c416-4739-465b-9af3-9dc33ed8eef9
但是,由于JavaScript的number
最高只能达到253 - 1,我无法在TypeScript客户端中将MSB/LSB格式转换回string
。
1条答案
按热度按时间rqmkfv5c1#
从Javax 1 m0n1x的
toString()
方法中寻找灵感,我们可以使用
BigInt
执行相同的操作。这里假设节点为10.8+(使用18.14.0测试),TypeScript目标为ES 2020+,并且与此浏览器兼容。注意:如果您得到“BigInt literals are not available...”,则将所有以
n
结尾的文字 Package 为BigInt
(例如,使用BigInt(32)
代替32n
)。示例测试中,注意MSB/LSB作为
string
s传递到BigInt
,最后一部分是协议缓冲区。默认情况下,
google-protobuf
使用number
作为64位float
和int
值,这会导致溢出超过Number.MAX_VALUE
或253 - 1。要避免这种情况,请在64位字段上使用jstype
注解。2023年更新:相反函数,从UUID字符串转换为有效位
这是一个往返测试