【问题标题】:Guid to Base64 in JavaJava 中的 Base64 指南
【发布时间】:2019-01-07 15:09:05
【问题描述】:

我正在使用以下代码在 C# 中将 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?
  • 试图从字符串转换,我得到了完全不同的结果
  • 为什么 Guid.parse() 和 UUID.fromString() 应该生成相同的结果?这是在某个地方定义的吗?
  • bb.array()id.ToByteArray() 不一样。
  • C#的Guid和Java的UUID不一样! This 可能对你有帮助!

标签: java base64 uuid


【解决方案1】:

结构有点不同,但在字节数组的第一部分交换一些字节可以解决您的问题。

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);

【讨论】:

猜你喜欢
  • 2011-01-13
  • 1970-01-01
  • 2016-07-27
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多