2009-06-23 24 views
34

问题:有没有更好的方法来做到这一点?guid to base64,对于URL

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

删除Base64编码的标准特殊字符的任何特殊原因? – Hemant 2009-06-23 12:56:46

+0

是否有特殊原因需要对其进行编码? GUID中的字符都不需要编码URL或属性。 – blowdart 2009-06-23 12:56:54

+0

@Hemant,因为对于URL,+和/和=在GET中效果不佳, @blowdart,使url更小 – Fredou 2009-06-23 12:59:33

回答

9

我明白你最后裁剪的原因==是因为你可以确定对于GUID(16字节),编码字符串总是以==结尾。所以每次转换都可以保存2个字符。

除了@Skurmedal已经提到的点(在无效字符串作为输入的情况下应该抛出一个异常),我认为你发布的代码足够好。

3

如果你的方法不能转换的Base64传递给它一个GUID,你不应该抛出异常?传递给该方法的数据显然是错误的。

11

使用这种技术来格式化GUID用于在URL或文件名的使用的一个问题是两个不同的GUID可产生区别仅在于存在的情况下的两个值,例如:

var b1 = GuidToBase64(new Guid("c9d045f3-e21c-46d0-971d-b92ebc2ab83c")); 
var b2 = GuidToBase64(new Guid("c9d045f3-e21c-46d0-971d-b92ebc2ab8a4")); 
Console.WriteLine(b1); // 80XQyRzi0EaXHbkuvCq4PA 
Console.WriteLine(b2); // 80XQyRzi0EaXHbkuvCq4pA 

由于网址而文件名通常被解释为不区分大小写,这可能会导致冲突。