2009-06-23 24 views
34

Câu hỏi: có cách nào tốt hơn để làm điều đó không?guid to base64, cho 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

Bất kỳ lý do đặc biệt nào khi xóa các ký tự đặc biệt chuẩn của mã hóa Base64? – Hemant

+0

Có lý do cụ thể nào bạn cần để mã hóa nó không? Không có ký tự nào trong GUID cần mã hóa cho URL hoặc thuộc tính. – blowdart

+0

@Hemant, vì URL, + và/và = không hoạt động tốt trong GET, @blowdart, để làm cho url nhỏ hơn – Fredou

Trả lời

9

Tôi hiểu rằng lý do bạn đang cắt == ở cuối là vì bạn có thể chắc chắn rằng đối với GUID (trong số 16 byte), chuỗi được mã hóa sẽ luôn luôn kết thúc bằng ==. Vì vậy, 2 ký tự có thể được lưu trong mọi chuyển đổi.

Bên cạnh điểm @Skurmedal đã được đề cập (nên ném ngoại lệ trong trường hợp chuỗi không hợp lệ làm đầu vào), tôi nghĩ rằng mã bạn đã đăng chỉ đủ tốt.

+0

Không nghĩ về điều đầu tiên đó, một trình tiết kiệm không gian thông minh khi bạn nghĩ về nó :) – Skurmedel

+0

là tốt nhất, đối phó với một ngoại lệ hoặc truy vấn cơ sở dữ liệu anyway với cái gì đó không tồn tại? nó sẽ thêm nhiều mã hơn cuối cùng kể từ khi tôi kiểm tra nếu có ít nhất một hàng trong kết quả? – Fredou

+0

Điểm chỉ là về * nơi * bạn muốn đặt séc đó. Kinh nghiệm của tôi là thói quen thư viện cấp thấp nên càng minh bạch càng tốt. Offcourse ở đây bạn là thẩm phán tốt nhất của nơi mã kiểm tra lỗi nên đi bởi vì * bạn * biết sản phẩm của bạn và nơi thư viện/mã này là viết tắt. Nó chỉ là một điểm để xem xét. – Hemant

3

Nếu phương pháp của bạn không thể chuyển đổi Base64 truyền cho nó vào một GUID, không nên bạn ném một ngoại lệ? Dữ liệu được truyền cho phương thức rõ ràng là sai.

+0

Nevermind, tôi đã hiểu sai mã gốc. – Skurmedel

+0

@Skumedel, Ok :-) – Fredou

+0

Tôi nghĩ rằng tôi đồng ý với các bạn, về việc ném một ngoại lệ, nó có ý nghĩa hơn – Fredou

11

Một vấn đề với việc sử dụng kỹ thuật này để định dạng một GUID để sử dụng trong một URL hoặc tên tập tin là hai GUIDs khác biệt có thể tạo ra hai giá trị mà chỉ khác nhau trong trường hợp, ví dụ:

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 

Kể từ URL và tên tập tin thường được hiểu là không phân biệt chữ hoa chữ thường, điều này có thể dẫn đến va chạm.