2009-06-23 27 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 

由於網址而文件名通常被解釋爲不區分大小寫,這可能會導致衝突。