当前位置: 首页 > 面试题库 >

如何将.NET Guid读取为Java UUID

徐兴昌
2023-03-14
问题内容

我需要将.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;
}

但是,当我使用检查UUID时toString(),Java UUID与.NET Guid不同。

例如,.NET Guid

888794c2-65ce-4de1-aa15-75a11342bc63

变成Java UUID

c2948788-ce65-e14d-aa15-75a11342bc63

看起来前三组的字节顺序是相反的,而后两组的顺序是相同的。

由于我希望toString()Guid和UUID都能产生相同的结果,所以有人知道我应该如何正确地将.NET Guid读入Java UUID吗?

编辑:
澄清一下,实现不是我自己的。它是java.util.UUID该类的私有构造函数,带有byte[],我复制了该函数以用于从磁盘将byte
[]读取到UUID中。

我不想使用字符串来存储Guid,因为我存储了很多Guid,这似乎是在浪费空间。

罗素·特洛伊斯特(Russell
Troywest)的链接至少阐明了为什么Guid的前几对以相反的顺序出现,而后半部分却保持相同的顺序。问题是,我是否可以依赖.NET 始终
以相同顺序生成这些字节?


问题答案:

响应您的编辑,不,您不能始终依赖以相同顺序生成的字节。运行时确定字节顺序。C#确实提供BitConverter.isLittleEndian了这个原因。

我知道您无法更改Java实现的字节序和位移。但是,您可以在存储之后以及将它们发送到Java之前将C#端的位移位。

更新:

关于IsLittleEndian的MSDN文章

编辑:实际上,您可以指望它在第一个字节块的布局中始终为小端,但从技术上讲您不能。



 类似资料:
  • 问题内容: 如果有一个对象,应该如何处理该对象并产生一个String? 假设我有一个包含文本数据的文件,并且想将其转换为String,因此例如可以将其写入日志文件。 InputStream将并将其转换为的最简单方法是String什么? 问题答案: 做到这一点的一种好方法是使用将apache复制 甚至 另外,如果您不想混合和 ,则可以使用

  • 问题内容: 我检查了一些类似的问题,但似乎没有一个合适的答案(或对我来说足够愚蠢)。因此,我有一个非常简单的WebAPI来检查DB中是否存在带有电子邮件的用户。 AJAX: WebAPI: 现在很明显,这是行不通的。Ajax调用工作正常,但是如何将json对象解析为WebAPI以便能够像调用它一样? 编辑 我无法将电子邮件地址作为字符串传递,因为逗号弄乱了路由。 ajax调用工作正常,该对象被发送

  • 问题内容: 嗨,我想读取N行的txt文件,并将结果放入字符串数组中。 问题答案: 使用和。

  • 问题内容: 我的表中有一行我不想更改(曾经)。 是否可以将MySQL行设置为READ-ONLY,以便不能以任何方式更新它?如果是这样,怎么办? 如果不是,是否可以在该行的某一列中设置一个永久值,以使其无法更改?如果是这样,怎么办? 谢谢。 问题答案: 这可能是业务逻辑,可能不属于您的数据存储层。但是,仍然可以使用触发器来实现。 如果将要更新“锁定”记录,则可以创建引发错误的触发器;由于 在执行 该

  • 问题内容: 我想在我的JQuery代码中将json响应读取为名称和值对。这是我从Java代码返回的示例JSON响应: 在我的JQuery中,如果我写的话,我将获得的价值。这是我的JQuery代码 在这里,我想读取jsonResponse而不是JQuery中的硬编码。诸如循环遍历响应以获取每个名称和值之类的东西。有什么建议? 问题答案: 重要的是要注意,属性的迭代顺序是任意的,不应依赖。

  • 问题内容: 如何在Java中将文件读取为字节? 重要的是要注意,所有字节都必须为正,即不能使用负范围。 可以用Java完成吗,如果可以,怎么做? 我需要能够将文件的内容乘以一个常数。我以为我可以将字节读取到BigInteger中,然后相乘,但是由于某些字节为负,所以我最终得到12 13 15 -12等并被卡住。 问题答案: 嗯,Java没有无符号字节的概念……该类型始终是带符号的,其值介于-128