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に直接アクセスすることはできません)。
GUIDは16バイトで表されます。さまざまな理由により、Javaと.NETはどちらも、を呼び出すときにこれらのバイトを順番に出力するだけではありませんtoString
。たとえば、質問からbase-64でエンコードされたGUIDを見ると、次のようになります。
GAElHwsix0a41iIsvQMT8A==
16進形式では次のようになります。
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]);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加