2009-05-12 8 views
7

मुझे नहीं पता कि मैं एक मूर्ख सवाल पूछ रहा हूं लेकिन मैं जानना चाहता हूं कि कनवर्ट करें। .NET में ToBase64String फ़ंक्शन समान लंबाई देता है क्योंकि यह स्रोत बाइट आकार है या यह अलग है? मैं एमएसडीएन से How To: Use Forms Authentication with SQL Server 2000 से आलेख को अपने पासवर्ड में आजमाने की कोशिश करना चाहता था, लेकिन मुझे पता चला कि वे जिस फंक्शन को नमक स्ट्रिंग बनाने के लिए इस्तेमाल करते हैं, वह वापस लौटने की अपेक्षा 3 गुना लौटा रहा है। यहां स्पष्ट करने के लिए उस लेख में कोड है।कनवर्ट करता है। ToBase64String उसी लंबाई को वापस लौटाता है क्योंकि यह स्रोत बाइट सरणी है?

private static string CreateSalt(int size) 
{ 
    // Generate a cryptographic random number using the cryptographic 
    // service provider 
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
    byte[] buff = new byte[size]; 
    rng.GetBytes(buff); 
    // Return a Base64 string representation of the random number 
    return Convert.ToBase64String(buff); 
} 

उत्तर

1

बाइट स्ट्रिंग का बेस 64 एन्कोडिंग बाइट स्ट्रिंग से लंबा है क्योंकि बाइट स्ट्रिंग में "स्थान" प्रति 2^8 संभावनाएं हैं, जबकि बेस 64 स्ट्रिंग में प्रति स्थान केवल 2^6 संभावनाएं हैं (यही कारण है कि हम इसे कॉल करते हैं आधार 64)।

बस लॉगेरिथम और कबूतर छेद के बारे में सोचें। संख्या 5000 लें। बेस 256 में स्टोर करने के लिए आपको कितने स्थान (कबूतर छेद, बाइट्स) की आवश्यकता है?

"Locations in base256" = ceil(log_2(5000)/8) = ceil(1.54) = 2 

जहां लॉग_2 आपको बताता है कि आपको कितनी बिट्स चाहिए। अब बेस 64 में कितने?

"Locations in base64" = ceil(log_2(5000)/6) = ceil(2.04) = 3 
14

नहीं है, Base64 रिटर्न 3 बाइट्स इनपुट के लिए 4 बाइट उत्पादन, को गिरफ्तार (= के साथ गद्देदार) अगले 4 बाइट सीमा तक।

int outputLength = ((inputLength+2)/3)*4 

ऐसा इसलिए है क्योंकि यह केवल केवल ASCII वर्ण जो वर्ण को नियंत्रित नहीं कर रहे हैं का उपयोग करने के लिए और 7 बिट रेंज में क्रम में बाइट प्रति 6 बिट (मूल रूप से एक नंबर 0-63) का उपयोग करता है। इसलिए, बेस 4.0 के साथ डेटा एन्कोड करते समय आपको 3 * 8 => 4 * 6 बिट मिलते हैं।

+0

धन्यवाद दोस्त। यह वास्तव में मुझे "=" पीछे की रहस्य के साथ मदद की। – User

5

बेस -64 इनपुट के समान ही लंबाई की एक स्ट्रिंग देता है। अनिवार्य रूप से, यह केवल 8 बिट्स उपलब्ध 6 का उपयोग कर रहा है, इसलिए बड़े संदेशों (विशेष रूप से) को अतिरिक्त 1/3 मात्रा की आवश्यकता होगी। संदेश को स्पष्ट बनाने के अंत में कुछ पैकिंग बाइट्स (आमतौर पर "=") होते हैं।

संबंधित मुद्दे