Frage: Gibt es eine bessere Möglichkeit, dies zu tun?
VB.Net
Function GuidToBase64(ByVal guid As Guid) As String
Return Convert.ToBase64String(guid.ToByteArray).Replace("/", "-").Replace("+", "_").Replace("=", "")
End Function
Function Base64ToGuid(ByVal base64 As String) As Guid
Dim guid As Guid
base64 = base64.Replace("-", "/").Replace("_", "+") & "=="
Try
guid = New Guid(Convert.FromBase64String(base64))
Catch ex As Exception
Throw New Exception("Bad Base64 conversion to GUID", ex)
End Try
Return guid
End Function
C#
public string GuidToBase64(Guid guid)
{
return Convert.ToBase64String(guid.ToByteArray()).Replace("/", "-").Replace("+", "_").Replace("=", "");
}
public Guid Base64ToGuid(string base64)
{
Guid guid = default(Guid);
base64 = base64.Replace("-", "/").Replace("_", "+") + "==";
try {
guid = new Guid(Convert.FromBase64String(base64));
}
catch (Exception ex) {
throw new Exception("Bad Base64 conversion to GUID", ex);
}
return guid;
}
0 Stimmen
Gibt es einen besonderen Grund für die Entfernung der Standard-Sonderzeichen der Base64-Kodierung?
0 Stimmen
Gibt es einen bestimmten Grund, warum Sie es kodieren müssen? Keines der Zeichen in einer GUID muss für URLs oder Attribute kodiert werden.
0 Stimmen
@Hemant, weil für URL, + und / und = funktioniert nicht gut in einem GET, @blowdart, um die url kleiner zu machen
0 Stimmen
@blowdart: Ich vermute, dass @Fredou die resultierende Zeichenkette so kurz wie möglich haben möchte, weshalb er sie kodiert.
0 Stimmen
Base64 macht eine Zeichenkette um 33% GRÖSSER, nicht kleiner
3 Stimmen
@Charlie: Base64-kodierter String ist kleiner als Hex-Kodierung, die bei der Verwendung von .ToString () als Standardformatierung verwendet wird. Natürlich möchte niemand rohe (nicht druckbare) Bytes direkt übertragen.
3 Stimmen
@Charlie wie "37945704-cf86-4b2e-a4b5-0db0204902c8" größer ist als "BFeUN4bPLkuktQ2wIEkCyA"
1 Stimmen
@usr, können Sie mir eine Guid nennen, die bei der Umwandlung in base64 "=" hat?
2 Stimmen
Ich würde in Erwägung ziehen, das .replace für die URL-Kodierung nicht zu verwenden, oder eine separate Methode dafür bereitzustellen. Dies würde eine Trennung der Belange ermöglichen, bei der die Benutzer der API wählen könnten, ob sie die echte base64-Kodierung oder die URL-freundliche base64-Kodierung wünschen, je nachdem, was sie erreichen wollen. Ich verstehe, dass Ihr Ziel die URL-Verwendung war, aber alles außer dem URL-Kodierungsschritt könnte möglicherweise für diejenigen verwendet werden, die eine kürzere base64-Kodierung wünschen, diese aber nicht in einer URL verwenden.
0 Stimmen
Führen Sie "aaaaaaaaaaaaaaaaaaaa" durch Base64ToGuid(), nehmen Sie dann den zurückgegebenen Guid und führen Sie ihn durch GuidToBase64() und Sie erhalten "aaaaaaaaaaaaaaaaaaaaaaaaaQ". Es gibt noch viele andere Beispiele wie dieses.
1 Stimmen
@Rick, sorry für die späte Antwort. Du hast Recht, dass die Kodierung in base64 ein anderes Ergebnis liefert, aber beide ergeben die gleiche Guid.
4 Stimmen
Ich würde empfehlen, die Ersetzungen zu ändern, d.h. statt
.Replace("+", "_")
und vice versa undReplace("/", "-")
und andersherum, verwenden Sie.Replace("+", "-")
und vice versa undReplace("/", "_")
und vice versa. Damit würde die Kodierung mit RFC 4648 konform gehenbase64url
(siehe tools.ietf.org/html/rfc4648#section-5 )