Java中Base64指南

4

我正在使用以下代码将Guid转换为Base64:

var id = Guid.Parse("be9f1bb6-5c8e-407d-85a3-d5ef31f21b4d");
var base64=Convert.ToBase64String(id.ToByteArray());

输出

thufvo5cfUCFo9XvMfIbTQ==

当我尝试在Java中使用以下代码做相同的事情时:

java.util.Base64.Encoder encoder=Base64.getEncoder();
UUID uuid = UUID.fromString("be9f1bb6-5c8e-407d-85a3-d5ef31f21b4d");
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
encoder.encodeToString(bb.array());

不同的输出结果

vp8btlyOQH2Fo9XvMfIbTQ==

我的Java代码哪里出了问题?我该如何获得与C#相同的结果?


为什么你需要先将它解析成UID? - ernest_k
尝试将其从字符串转换,结果完全不同。 - Yahya Hussein
为什么Guid.parse()和UUID.fromString()应该生成相同的结果?这个定义在哪里? - Konrad
bb.array()id.ToByteArray()不是相同的。 - zhh
1
C#的Guid和Java的UUID不相同!这个链接可能对你有帮助! - Zico
此外,附加的背景信息提供了对这个问题的答案:GUID和UUID之间有什么区别吗? - LuCio
1个回答

3

结构略有不同,但交换字节数组的前半部分中的一些字节可以解决您的问题。

java.util.Base64.Encoder encoder= Base64.getEncoder();
UUID uuid = UUID.fromString("be9f1bb6-5c8e-407d-85a3-d5ef31f21b4d");
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());

byte[] uuid_bytes = bb.array();
byte[] guid_bytes = Arrays.copyOf(uuid_bytes,uuid_bytes.length);

guid_bytes[0] = uuid_bytes[3];
guid_bytes[1] = uuid_bytes[2];
guid_bytes[2] = uuid_bytes[1];
guid_bytes[3] = uuid_bytes[0];
guid_bytes[4] = uuid_bytes[5];
guid_bytes[5] = uuid_bytes[4];
guid_bytes[6] = uuid_bytes[7];
guid_bytes[7] = uuid_bytes[6];

String result = encoder.encodeToString(guid_bytes);

似乎.NET使用了非标准的位序。也许这对某些人会有帮助:https://dev59.com/lWkw5IYBdhLWcg3wBl-A 和 https://dev59.com/IWoy5IYBdhLWcg3wieu6#16722909 - Denis
许多系统完全以大端格式编码UUID。其他系统,特别是微软在其COM/OLE库中编组UUID时,使用混合端格式,其中UUID的前三个组件为小端,后两个组件为大端。请参见https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding。 - Denis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接