如何将.NET Guid读取到Java UUID中

我需要将.NET中生成的Guid传递给Java应用程序。 我使用Guid.ToByteArray()将其作为byte[]存储在磁盘上,然后将其读取到Java中并将其转换为UUID。 为此,我复制了需要一个byte[]的UUID的(专用)构造函数的实现:

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[] ,我将其复制用于从磁盘读取一个字节[]到一个UUID。

我不想使用字符串来存储Guids,因为我存储了很多它们,这看起来像是浪费空间。

罗素特洛伊韦斯特的链接至少说明了为什么Guid的第一批几个团队出现逆转,而下半部分则保持相同的顺序。 问题是,我可以依赖.NET 总是以相同的顺序生成这些字节吗?


为了响应你的编辑,不,你不能始终依靠以相同顺序生成的字节。 运行时间确定字节序。 然而,C#确实为此提供了BitConverter.isLittleEndian

我知道你不能改变Java实现的字节顺序和位移。 但是在存储之后以及在将它们发送给Java之前,您可以移动C#端的位。

更新:

关于IsLittleEndian的MSDN文章

编辑:为了切实可行,你可以指望它在第一个字节块的布局中始终是小端,但在技术上你不能。


你能否将.Net Guid存储为一个字符串并将其读入Java? 这样你就不必担心字节顺序或任何事情。

如果没有,那么这解释了如何在C#中布置字节

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


编辑2017-08-30 :每个评论交换数组元素6和7。

我必须读/写MySQL中的Guids(存储为二进制文件(16))到C#应用程序中,但数据库也被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);
    }
}
链接地址: http://www.djcxy.com/p/91473.html

上一篇: How to read a .NET Guid into a Java UUID

下一篇: UUID performance in MySQL?