【发布时间】:2011-08-10 08:55:19
【问题描述】:
我需要将 .NET 中生成的 Guid 传递给 Java 应用程序。我使用Guid.ToByteArray() 将其作为byte[] 存储在磁盘上,然后将其读入Java 并将其转换为UUID。为此,我复制了 UUID 的(私有)构造函数的实现,该构造函数采用 byte[]:
private UUID(byte[] data) {
long msb = 0;
long lsb = 0;
assert data.length == 16;
for (int i=0; i<8; i++)
msb = (msb << 8) | (data[i] & 0xff);
for (int i=8; i<16; i++)
lsb = (lsb << 8) | (data[i] & 0xff);
this.mostSigBits = msb;
this.leastSigBits = lsb;
}
但是,当我使用 toString() 检查 UUID 时,Java UUID 与 .NET Guid 不同。
例如,.NET Guid
888794c2-65ce-4de1-aa15-75a11342bc63
变成Java UUID
c2948788-ce65-e14d-aa15-75a11342bc63
好像前三组的字节顺序颠倒了,而后两组的顺序是一样的。
由于我希望 Guid 和 UUID 的 toString() 产生相同的结果,有谁知道我应该如何正确地将 .NET Guid 读入 Java UUID?
编辑:澄清一下,实现不是我自己的。它是 java.util.UUID 类的私有构造函数,它采用 byte[],我复制它以用于将 byte[] 从磁盘读取到 UUID。
我不想使用字符串来存储 Guid,因为我存储了很多,这似乎浪费空间。
Russell Troywest 的链接至少阐明了为什么 Guid 的前几组出现反转,而后半部分保持相同的顺序。问题是,我可以依赖 .NET 总是以相同的顺序生成这些字节吗?
【问题讨论】:
-
看起来您以错误的方式移动位。为什么要尝试让它变得可爱呢?读取字节并首先进行适当的分配(首先使用索引),然后使用移位运算符进行优化(如有必要)。关键是要有易于理解的代码。
-
Java 严格按照 Big Endian 存储数据,而 C# 没有指定“endianness”,但通常将数据存储为 Little Endian。就像@casperOne 说的那样,你换错了方向。
-
我一直在尝试对使用这种结构的框架进行逆向工程。一直盯着奇怪的位移两个多小时,直到我找到了这个帖子。