2011-10-30 12 views
37

पर एक स्ट्रिंग को बाइट सरणी में कनवर्ट करना संभव है और फिर उसे जावा या एंड्रॉइड में मूल स्ट्रिंग में परिवर्तित करना संभव है?एक स्ट्रिंग को एक बाइट सरणी में कनवर्ट करें और फिर मूल स्ट्रिंग

मेरा उद्देश्य कुछ स्ट्रिंग्स को माइक्रोकंट्रोलर (Arduino) में भेजना है और इसे ईईपीरोम में स्टोर करना है (जो केवल 1   केबी है)। मैंने MD5 हैश का उपयोग करने का प्रयास किया, लेकिन ऐसा लगता है कि यह केवल एक ही तरीका एन्क्रिप्शन है। इस मुद्दे से निपटने के लिए मैं क्या कर सकता हूं?

+0

SHA128 का उपयोग कर यदि आप 'की कोशिश करो एक adruino करने के लिए स्ट्रिंग भेज रहे हैं। यह उलटा है; लेकिन मुझे नहीं पता कि आपको Arduino पर उस कोड की आवश्यकता होगी या नहीं। –

उत्तर

89

मैं स्ट्रिंग के सदस्यों का उपयोग कर सुझाव है, लेकिन कोई स्पष्ट एन्कोडिंग साथ :

byte[] bytes = text.getBytes("UTF-8"); 
String text = new String(bytes, "UTF-8"); 

एक स्पष्ट एन्कोडिंग (और एक जो यूनिकोड का समर्थन करता है) का उपयोग कर आप सिर्फ text.getBytes() आदि बुलाने की समस्याओं से बचने के:

  • आप स्पष्ट रूप से एक विशिष्ट एन्कोडिंग का उपयोग कर रहे हैं, तो आप प्लेटफ़ॉर्म डिफ़ॉल्ट पर निर्भर होने के बजाय बाद में उपयोग करने के लिए कौन सी एन्कोडिंग का उपयोग कर सकते हैं।
  • आप जानते हैं कि यह यूनिकोड के सभी का समर्थन करेगा (जैसा कि कहता है, आईएसओ-लैटिन -1)।

संपादित करें: भले ही यूटीएफ -8 एंड्रॉइड पर डिफ़ॉल्ट एन्कोडिंग है, मैं निश्चित रूप से इसके बारे में स्पष्ट हूं। उदाहरण के लिए, यह प्रश्न केवल "जावा या एंड्रॉइड में" कहता है - इसलिए यह पूरी तरह से संभव है कि कोड अन्य प्लेटफ़ॉर्म पर उपयोग किया जा रहा है।

मूल रूप से सामान्य जावा प्लेटफ़ॉर्म में अलग-अलग डिफ़ॉल्ट एन्कोडिंग हो सकती हैं, मुझे लगता है कि यह बिल्कुल स्पष्ट होना सर्वोत्तम है। मैंने डिफ़ॉल्ट एन्कोडिंग का उपयोग करके बहुत से लोगों को देखा है और उस जोखिम को लेने के लिए डेटा खोना है।

संपादित करें: मेरी जल्दबाजी में मैं तुम्हें एन्कोडिंग के नाम उपयोग करने के लिए की जरूरत नहीं है कि उल्लेख करना भूल गया - आप एक Charset बजाय उपयोग कर सकते हैं। Guava का उपयोग करते हुए मैं वास्तव में का उपयोग करेंगे:

byte[] bytes = text.getBytes(Charsets.UTF_8); 
String text = new String(bytes, Charsets.UTF_8); 
+1

क्या यूटीएफ -8 एंड्रॉइड प्लेटफ़ॉर्म डिफ़ॉल्ट नहीं है? – ewanm89

+1

सार्वजनिक स्थैतिक वर्णसेट डिफ़ॉल्ट चार्टसेट() चूंकि: API स्तर 1 सिस्टम का डिफ़ॉल्ट वर्णमाला देता है। यह वीएम स्टार्टअप के दौरान निर्धारित किया जाता है, और उसके बाद नहीं बदलेगा। एंड्रॉइड पर, डिफ़ॉल्ट वर्णसेट यूटीएफ -8 है। – ewanm89

+1

@ ewanm89: ठीक है, सवाल "जावा या एंड्रॉइड में" कहता है - मैं व्यक्तिगत रूप से इसके बारे में स्पष्ट रूप से स्पष्ट रहूंगा, सिर्फ इसलिए कि अन्य जावा प्लेटफॉर्म पर यह हमेशा * डिफ़ॉल्ट नहीं है। कोड को (कहें) के साथ कोड साझा करना बहुत आसान होगा और फिर गलत परिणाम प्राप्त करें। –

3

बाइट्स में कनवर्ट करने के लिए [String.getBytes()][1] का उपयोग करें और स्ट्रिंग में वापस कनवर्ट करने के लिए [String(byte[] data)][2] कन्स्ट्रक्टर का उपयोग करें।

+3

... लेकिन एन्कोडिंग निर्दिष्ट किए बिना इनमें से किसी एक का उपयोग न करें, अन्यथा आप प्लेटफ़ॉर्म डिफ़ॉल्ट एन्कोडिंग का उपयोग कर रहे हैं जो आपकी स्ट्रिंग में सभी वर्णों का समर्थन भी नहीं कर सकता है। –

10

आप इसे ऐसा कर सकते हैं।

बाइट सरणी स्ट्रिंग

String stringToConvert = "This String is 76 characters long and will be converted to an array of bytes"; 
byte[] theByteArray = stringToConvert.getBytes(); 

http://www.javadb.com/convert-string-to-byte-array

बाइट सरणी स्ट्रिंग के लिए

byte[] byteArray = new byte[] {87, 79, 87, 46, 46, 46}; 
String value = new String(byteArray); 

http://www.javadb.com/convert-byte-array-to-string

+3

मैं निश्चित रूप से * उस कोड का उपयोग नहीं करता *। यह मानता है कि दोनों जगहों पर उपयोग किए जाने पर प्लेटफॉर्म डिफ़ॉल्ट एन्कोडिंग वही है, और यह भी कि प्लेटफ़ॉर्म डिफ़ॉल्ट एन्कोडिंग स्ट्रिंग में सभी वर्णों को संभालती है। –

+0

एंड्रॉइड का डिफ़ॉल्ट वर्णसेट यूटीएफ -8 है, जो वही है जैसा आप सुझाव दे रहे हैं, इसलिए ऐसा करने का कोई कारण नहीं है। यदि आप किसी अन्य प्रकार के एन्कोडिंग का उपयोग करने जा रहे हैं, तो आपको शायद अपने सुझाव में कोड का उपयोग करना चाहिए और जो कुछ भी आप उपयोग कर रहे हैं उसे फिट करने के लिए इसे थोड़ा सा समायोजित करना चाहिए। –

+0

मैं अभी भी इसके बारे में स्पष्ट होगा। टिप्पणी जो मैंने अभी अपने उत्तर पर छोड़ी है, जिसे मैं * में * उत्तर में भी संपादित करूंगा। –

0

आयात java.io.FileInputStream; आयात java.io.ByteArrayOutputStream;

सार्वजनिक वर्ग FileHashStream { // एक नई पद्धति है कि एक नए बाइट सरणी प्रदान करेगा लिखते हैं, और जहां यह आम तौर पर एक इनपुट स्ट्रीम

public static byte[] read(InputStream is) throws Exception 
{ 
    String path = /* type in the absolute path for the 'commons-codec-1.10-bin.zip' */; 

    // must need a Byte buffer 

    byte[] buf = new byte[1024 * 16] 

    // we will use 16 kilobytes 

    int len = 0; 

    // we need a new input stream 

    FileInputStream is = new FileInputStream(path); 

    // use the buffer to update our "MessageDigest" instance 

    while(true) 
    { 
     len = is.read(buf); 
     if(len < 0) break; 
     md.update(buf, 0, len); 
    } 

    // close the input stream 

    is.close(); 

    // call the "digest" method for obtaining the final hash-result 

    byte[] ret = md.digest(); 

    System.out.println("Length of Hash: " + ret.length); 

    for(byte b : ret) 
    { 
     System.out.println(b + ", "); 
    } 

    String compare = "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"; 

    String verification = Hex.encodeHexString(ret); 

    System.out.println(); 

    System.out.println("===") 

    System.out.println(verification); 

    System.out.println("Equals? " + verification.equals(compare)); 

} 

से पढ़ता}