java - एक स्ट्रिंग को बाइट सरणी में कनवर्ट करें और फिर मूल स्ट्रिंग पर वापस जाएं




android byte (4)

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

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


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

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

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


आयात 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));

}

}


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


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

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

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

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

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

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

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

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





arduino