如何将 .NET Guid 读入 Java UUID

2022-09-01 18:37:59

我需要将 .NET 中生成的 Guid 传达给 Java 应用程序。我用它来将它作为存储在磁盘上,然后将其读入Java并将其转换为UUID。为此,我复制了UUID的(私有)构造函数的实现,该构造函数采用:Guid.ToByteArray()byte[]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 时,Java UUID 与 .NET Guid 不同。toString()

例如,.NET Guid

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

变成 Java UUID

c2948788-ce65-e14d-aa15-75a11342bc63

似乎前三组的字节顺序是相反的,而最后两组的顺序是相同的。

由于我期望 Guid 和 UUID 产生相同的结果,有谁知道我应该如何将 .NET Guid 正确读取到 Java UUID 中?toString()

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

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

Russell Troywest的链接至少澄清了为什么Guid的前几组反转,而后半部分则保持相同的顺序。问题是,我是否可以依赖 .NET 始终以相同的顺序生成这些字节?


答案 1

您不能将 .Net Guid 存储为字符串并将其读入 Java?这样,您就无需担心字节顺序或任何东西。

如果不是,那么这解释了字节在C中的布局方式#

http://msdn.microsoft.com/en-us/library/fx22893a.aspx


答案 2

编辑 2017-08-30:交换了每个注释的数组元素 6 和 7。

我必须在C#应用程序中读取/写入MySQL(存储为二进制(16))的Guids,但Java应用程序也使用数据库。以下是我用于在 .NET 小端字节序和 Java 大端字节序之间进行转换的扩展方法:

public static class GuidExtensions
{
    /// <summary>
    /// A CLSCompliant method to convert a Java big-endian Guid to a .NET 
    /// little-endian Guid.
    /// The Guid Constructor (UInt32, UInt16, UInt16, Byte, Byte, Byte, Byte,
    ///  Byte, Byte, Byte, Byte) is not CLSCompliant.
    /// </summary>
    [CLSCompliant(true)]
    public static Guid ToLittleEndian(this Guid javaGuid) {
        byte[] net = new byte[16];
        byte[] java = javaGuid.ToByteArray();
        for (int i = 8; i < 16; i++) {
            net[i] = java[i];
        }
        net[3] = java[0];
        net[2] = java[1];
        net[1] = java[2];
        net[0] = java[3];
        net[5] = java[4];
        net[4] = java[5];
        net[6] = java[7];
        net[7] = java[6];
        return new Guid(net);
    }

    /// <summary>
    /// Converts little-endian .NET guids to big-endian Java guids:
    /// </summary>
    [CLSCompliant(true)]
    public static Guid ToBigEndian(this Guid netGuid) {
        byte[] java = new byte[16];
        byte[] net = netGuid.ToByteArray();
        for (int i = 8; i < 16; i++) {
            java[i] = net[i];
        }
        java[0] = net[3];
        java[1] = net[2];
        java[2] = net[1];
        java[3] = net[0];
        java[4] = net[5];
        java[5] = net[4];
        java[6] = net[7];
        java[7] = net[6];
        return new Guid(java);
    }
}