将 Java UUID 对象转换为 .NET GUID 字符串
Transforming a Java UUID object to a .NET GUID string
在接收 java.util.UUID 对象的 Java 方法中,我想将该对象显示为 .NET/C# 格式 (CSUUID) 的字符串。
目前我只能以Java格式(JUUID)显示它:
static String GetStringFromUuid (java.util.UUID myUuid){
return myUuid.toString();
}
Current output: "46c7220b-1f25-0118-f013-03bd2c22d6b8"
Desired output: "1f250118-220b-46c7-b8d6-222cbd0313f0"
上下文:
UUID 存储在MongoDB 中,并使用Java ETL 程序Talend(tMongoDB输入组件)检索。
在Java程序中,该方法已经将UUID接收为java.util.UUID对象(我无法直接访问程序中的BinData)。
- 我需要以 C# 格式显示 UUID,因为其他程序已经以 C# 格式显示 UUID。
- 如果可能有用,示例数据存储在 MongoDB 中,如下所示:
BinData(3,"GAElHwsix0a41iIsvQMT8A==")
- 我需要 Java 中的解决方案。
我们可以只将 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();
Guid 由 16 个字节表示。由于各种原因,Java 和 .NET 在您调用 toString
时并不只是按顺序打印这些字节。例如,如果我们从您的问题中查看 base-64 编码的 guid:
GAElHwsix0a41iIsvQMT8A==
十六进制格式如下:
18-01-25-1f-0b-22-c7-46-b8-d6-22-2c-bd-03-13-f0
Java toString
产生这个(如果我们按上面的格式):
46-c7-22-0b-1f-25-01-18-f0-13-03-bd-2c-22-d6-b8
.NET ToString
产生这个:
1f-25-01-18-22-0b-46-c7-b8-d6-22-2c-bd-03-13-f0
如果你看这个一段时间 - 你会注意到 java 和 .NET 字符串都代表相同的 16 个字节,但这些字节在输出字符串中的位置不同。因此,要将 java 表示形式转换为 .NET,您只需对它们重新排序。示例代码(我不知道java,所以可能可以用更好的方式完成,但仍然应该达到预期的结果):
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.util.UUID 对象的 Java 方法中,我想将该对象显示为 .NET/C# 格式 (CSUUID) 的字符串。
目前我只能以Java格式(JUUID)显示它:
static String GetStringFromUuid (java.util.UUID myUuid){
return myUuid.toString();
}
Current output: "46c7220b-1f25-0118-f013-03bd2c22d6b8"
Desired output: "1f250118-220b-46c7-b8d6-222cbd0313f0"
上下文:
UUID 存储在MongoDB 中,并使用Java ETL 程序Talend(tMongoDB输入组件)检索。
在Java程序中,该方法已经将UUID接收为java.util.UUID对象(我无法直接访问程序中的BinData)。
- 我需要以 C# 格式显示 UUID,因为其他程序已经以 C# 格式显示 UUID。
- 如果可能有用,示例数据存储在 MongoDB 中,如下所示: BinData(3,"GAElHwsix0a41iIsvQMT8A==")
- 我需要 Java 中的解决方案。
我们可以只将 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();
Guid 由 16 个字节表示。由于各种原因,Java 和 .NET 在您调用 toString
时并不只是按顺序打印这些字节。例如,如果我们从您的问题中查看 base-64 编码的 guid:
GAElHwsix0a41iIsvQMT8A==
十六进制格式如下:
18-01-25-1f-0b-22-c7-46-b8-d6-22-2c-bd-03-13-f0
Java toString
产生这个(如果我们按上面的格式):
46-c7-22-0b-1f-25-01-18-f0-13-03-bd-2c-22-d6-b8
.NET ToString
产生这个:
1f-25-01-18-22-0b-46-c7-b8-d6-22-2c-bd-03-13-f0
如果你看这个一段时间 - 你会注意到 java 和 .NET 字符串都代表相同的 16 个字节,但这些字节在输出字符串中的位置不同。因此,要将 java 表示形式转换为 .NET,您只需对它们重新排序。示例代码(我不知道java,所以可能可以用更好的方式完成,但仍然应该达到预期的结果):
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]);
}