在一个接收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(tMongoDBInput组件)进行检索.
>在Java程序中,该方法已经将UUID作为java.util.UUID对象接收(我无法直接访问程序中的BinData).
>我需要以C#格式显示UUID,因为其他程序已经以C#格式显示UUID.
>如果可能有用,示例数据将存储在MongoDB中,如下所示:
BinData(3,“ GAElHwsix0a41iIsvQMT8A ==”)
>我需要Java解决方案.
解决方法:
Guid由16个字节表示.由于各种原因,当您调用toString时,Java和.NET都不会仅按顺序打印这些字节.例如,如果我们从您的问题中查看以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 ToStrin*生此:
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]);
}