2009-06-23 6 views
34

के लिए बेस 64 के लिए guid प्रश्न: क्या ऐसा करने का एक बेहतर तरीका है?यूआरएल

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 

सी #

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

बेस 64 एन्कोडिंग के मानक विशेष वर्णों को हटाने का कोई विशेष कारण? – Hemant

+0

क्या कोई विशेष कारण है कि आपको इसे एन्कोड करने की आवश्यकता है? GUID में वर्णों में से कोई भी वर्ण URL या विशेषताओं के लिए एन्कोडिंग की आवश्यकता नहीं है। – blowdart

+0

@ हेमेंट, क्योंकि यूआरएल के लिए, + और/और = जीईटी, @ ब्लौडार्ट में अच्छी तरह से काम नहीं करता है, यूआरएल छोटे – Fredou

उत्तर

9

मैं समझता हूं कि आप क्लिपिंग == अंत में क्लिपिंग कर रहे हैं क्योंकि यह सुनिश्चित हो सकता है कि GUID (16 बाइट्स) के लिए, एन्कोडेड स्ट्रिंग हमेशा == के साथ समाप्त होगी। तो प्रत्येक रूपांतरण में 2 अक्षर सहेजे जा सकते हैं।

बिंदु के अलावा @Skurmedal पहले से ही उल्लेख किया गया है (इनपुट के रूप में अमान्य स्ट्रिंग के मामले में अपवाद फेंकना चाहिए), मुझे लगता है कि आपके द्वारा पोस्ट किया गया कोड बस इतना अच्छा है।

+0

उस पहली चीज़ के बारे में नहीं सोचा था, जब आप इसके बारे में सोचते हैं तो एक चालाक अंतरिक्ष सेवर :) – Skurmedel

+0

क्या होगा सबसे अच्छा हो, किसी अपवाद से निपटने या डेटाबेस से पूछताछ किसी भी तरह से मौजूद नहीं है? क्या यह अंत में अधिक कोड जोड़ देगा क्योंकि मैं जांच करता हूं कि परिणाम में कम से कम एक पंक्ति है या नहीं? – Fredou

+0

बिंदु केवल * जहां * आप उस चेक को रखना चाहते हैं। मेरा अनुभव यह है कि निम्न स्तर की लाइब्रेरी दिनचर्या जितनी संभव हो उतनी पारदर्शी होनी चाहिए। यहां पर आप सबसे अच्छे न्यायाधीश हैं जहां त्रुटि जांच कोड जाना चाहिए क्योंकि * आप * अपने उत्पाद को जानते हैं और यह पुस्तकालय/कोड कहां खड़ा है। यह विचार के लिए सिर्फ एक बिंदु था। – Hemant

3

अपने विधि Base64 परिवर्तित नहीं कर सकते एक GUID को यह करने के लिए पारित कर दिया है, तो आप एक अपवाद नहीं फेंक देना चाहिए? विधि को पारित डेटा स्पष्ट रूप से गलत है।

+0

कभी नहीं, मैं मूल कोड को याद करता हूं। – Skurmedel

+0

@ स्कुमेडेल, ठीक है :-) – Fredou

+0

मुझे लगता है कि मैं आपके साथ लोगों से सहमत हूं, अपवाद फेंकने के बारे में, यह अधिक समझ में आता है – Fredou

11

एक URL या फ़ाइल नाम में इस्तेमाल के लिए एक GUID फ़ॉर्मेट करने के लिए इस तकनीक का उपयोग करने के साथ एक समस्या यह है कि दो अलग-अलग GUIDs दो मानों कि केवल मामले में भिन्न होते हैं, जैसे उत्पादन कर सकते हैं है:

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 

यूआरएल के बाद से और फ़ाइल नामों को अक्सर केस-प्रेरक होने के रूप में व्याख्या किया जाता है, इससे टकराव हो सकता है।