将Java UUID对象转换为.NET GUID字符串

时间:2018-03-02 20:38:32

标签: java c# mongodb uuid guid

在接收java.util.UUID对象的Java方法中,我想将此对象显示为.NET / C#格式(CSUUID)的字符串。

目前我只能以Java格式(JUUID)显示它:

static String GetStringFromUuid (java.util.UUID myUuid){
    return myUuid.toString();
}
  

当前输出:" 46c7220b-1f25-0118-f013-03bd2c22d6b8"

     

期望的输出:" 1f250118-220b-46c7-b8d6-222cbd0313f0"

背景:

  • UUID存储在MongoDB中,并使用Java ETL程序Talend(tMongoDBInput组件)进行检索。

  • 在Java程序中,该方法已经将UUID作为java.util.UUID对象接收(我没有直接访问程序中的BinData)。

  • 我需要以C#格式显示UUID,因为其他程序已经显示了C#格式的UUID。
  • 如果它可能有用,示例数据存储在MongoDB中,如下所示: BinData(3" GAElHwsix0a41iIsvQMT8A ==&#34)
  • 我需要一个Java解决方案。

2 个答案:

答案 0 :(得分:4)

Guid由16个字节表示。由于各种原因,当您调用GAElHwsix0a41iIsvQMT8A== 时,Java和.NET都不会按顺序打印这些字节。例如,如果我们从您的问题中查看base-64编码的guid:

18-01-25-1f-0b-22-c7-46-b8-d6-22-2c-bd-03-13-f0

以十六进制形式显示如下:

toString

Java 46-c7-22-0b-1f-25-01-18-f0-13-03-bd-2c-22-d6-b8 产生这个(如果我们按上面那样格式化):

ToString

.NET 1f-25-01-18-22-0b-46-c7-b8-d6-22-2c-bd-03-13-f0 产生了这个:

static String GetStringFromUuid (java.util.UUID myUuid){
    byte[] bytes = new byte[16];
    // convert uuid to byte array
    ByteBuffer bb = ByteBuffer.wrap(bytes);
    bb.putLong(myUuid.getMostSignificantBits());
    bb.putLong(myUuid.getLeastSignificantBits());
    // reorder
    return String.format("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
        bytes[4],bytes[5],bytes[6],bytes[7],
        bytes[2],bytes[3],bytes[0],bytes[1],
        bytes[15],bytes[14],bytes[13],bytes[12],
        bytes[11],bytes[10],bytes[9],bytes[8]);
}

如果你看一段时间 - 你会发现java和.NET字符串代表相同的16个字节,但输出字符串中这些字节的位置是不同的。因此,要从java表示转换为.NET,您只需要重新排序它们。示例代码(我不了解java,所以可能以更好的方式完成,但仍应达到预期的结果):

int arr[] = {2,3,4,5,6};

答案 1 :(得分:0)

我们可以将GUID保持为字符串,如果c#函数正在接收字符串并且它需要显示或作为字符串发送到某个服务

以防万一你要解析它。 You can use the link for GUID parsing logic example

要在 C#中创建新GUID,请使用

var guid = System.Guid.NewGuid();
var guidString = guid.ToString();

要在 Java 中创建新的UUID,请使用

UUID uuid = java.util.UUID.randomUUID();
String uuidString = uuid.toString();