2011-04-27 11 views
12

मेरे पास पांच-वर्ण वाली स्ट्रिंग है और मैं उन पांच अक्षरों को ASCII-encoded (प्रिंट करने योग्य) संख्या के रूप में उपयोग करना चाहता हूं। सबसे आसान तरीका है इस लक्ष्य को हासिल करने के लिएरेडिक्स के साथ जावा नंबर> वर्ण .MAX_RADIX

Long.toString(number, Character.MAX_RADIX); 

उपयोग करने के लिए यह मैं "0" से "zzzzz" को नंबर दे देंगे। दुर्भाग्यवश Long.toString(int, int) केवल निम्न-केस अक्षरों का समर्थन करता है, कोई ऊपरी-केस अक्षर नहीं। इसका मतलब है कि अधिकतम रेडिक्स 36 है और उच्चतम संख्या जिसे मैं एन्कोड कर सकता हूं 36^5 - 1 = 60 466 175 है। यदि मैं निचले और ऊपरी-केस अक्षरों दोनों का उपयोग कर सकता हूं, तो मुझे 62 का अधिकतम रेडिक्स मिलेगा और उच्चतम एन्कोडेबल नंबर 62^5 - 1 = 916 132 831 है।

Long के स्रोत कोड की प्रतिलिपि बनाने और संभावित अंकों को विस्तारित करने के अलावा, क्या कोई अन्य जगह है जहां मुझे देखना चाहिए, पहले, जहां यह पहले ही लागू हो चुका है?

+0

आप बेस 64 एन्कोडर्स और डिकोडर्स (उदाहरण के लिए, http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html) देखना चाहते हैं, जो दो अतिरिक्त प्रतीकों का उपयोग करते हैं एन्कोडिंग के लिए। – subsub

+0

@subsub: व्हाइटफैंग का उत्तर –

उत्तर

3

आप निर्दिष्ट नहीं करते हैं या नहीं, वर्ण प्रिंट करने योग्य ASCII होने की जरूरत:

  • हैं वे करते हैं, तो आप 95^5 पर जा सकते हैं। अंतरिक्ष (एसपी) से टिल्ड (~) तक 95 प्रिंट करने योग्य ASCII वर्ण हैं।

  • यदि वे नहीं करते हैं, तो आप 128^5 == 2^35 पर जा सकते हैं।

किसी भी तरह से, रूपांतरण करने के लिए एल्गोरिथ्म आसान है, और Long.toString(...) के लिए एक विस्तार से सरल है। (संभवतः आपको <-> अंक मैपिंग में संकेतों, रेंज त्रुटियों या छेदों के बारे में चिंता करने की ज़रूरत नहीं है। इसे स्क्रैच से कोड करना आसान होगा।)

हालांकि, मुझे किसी भी मौजूदा के बारे में पता नहीं है विस्तारित रेडिक्स संख्याओं के कार्यान्वयन

+0

उन्हें "** प्रिंट करने योग्य **" होना चाहिए। मैं सवाल अपडेट करूँगा, धन्यवाद। '[0-9 ए-जेए-जेड] 'के अलावा कुछ विशेष पात्र भी ठीक होंगे (जैसे'/',' -', '_', आदि) –

+0

अपडेट के लिए धन्यवाद। मुझे पता है कि यह सीधा है। मैं इसे 'java.lang.Long' से कॉपी कर सकता हूं। मैं बस सोच रहा था कि क्या मैंने कुछ ऐसा अनदेखा किया जहां 'Character.MAX_RADIX' सीमा नहीं है ... –

4

यदि आप अल्फान्यूमेरिक से परे दो अक्षर जाने के इच्छुक हैं तो आप Base64 एन्कोडिंग का उपयोग कर सकते हैं।

Apache Commons Codec से Base64 का उपयोग करके आप इस तरह १०७३७४१८२४ संभावित मान मिल सकता है:

byte bytes[] = new byte[4]; 
bytes[0] = (byte) ((value >> 24) & 0xFF); 
bytes[1] = (byte) ((value >> 16) & 0xFF); 
bytes[2] = (byte) ((value >> 8) & 0xFF); 
bytes[3] = (byte) (value & 0xFF); 
String encoded = Base64.encodeBase64String(bytes).substring(1, 6); 
+0

अच्छा विचार देखें। लेकिन पिछला '=' और '==' अतिरिक्त स्थान का उपयोग नहीं करेगा? इसके अलावा, मैंने इसे नहीं माना, क्योंकि परिवर्तन 'बाइट []' से 'स्ट्रिंग' तक जाता है, न कि' संख्या' से 'स्ट्रिंग' तक। लेकिन मैं 'संख्या' से' बाइट [] ' –

+0

से अतिरिक्त" एन्कोडिंग "को संभाल सकता हूं, आप 'int' के 3 बाइट्स का उपयोग करके पीछे की ओर' = 'से बच सकते हैं। इससे आपको 4 अक्षरों में एन्कोड करने के लिए 24 बिट भी मिलेंगे। – WhiteFang34

+0

3 बाइट पर्याप्त नहीं है: '256^3 - 1 = 16 777 215', जो मेरे मूल समाधान से कम है जहां मुझे' 60 466 175' एन्कोडेबल मान –