जावा स्ट्रिंग को बाइट में कैसे बदलें []?


538

क्या जावा को परिवर्तित करने का कोई तरीका Stringहै byte[]( बॉक्सिंग नहींByte[] )?

इस कोशिश में:

System.out.println(response.split("\r\n\r\n")[1]);
System.out.println("******");
System.out.println(response.split("\r\n\r\n")[1].getBytes().toString());

और मुझे अलग-अलग आउटपुट मिल रहे हैं। 1 आउटपुट प्रदर्शित करने में असमर्थ क्योंकि यह एक gzip स्ट्रिंग है।

<A Gzip String>
******
[B@38ee9f13

दूसरा पता है। क्या मैं कुछ गलत कर रहा हूं? मुझे byte[]गज़िप डीकंप्रेसर को खिलाने के लिए परिणाम की आवश्यकता है , जो निम्नानुसार है।

String decompressGZIP(byte[] gzip) throws IOException {
    java.util.zip.Inflater inf = new java.util.zip.Inflater();
    java.io.ByteArrayInputStream bytein = new java.io.ByteArrayInputStream(gzip);
    java.util.zip.GZIPInputStream gzin = new java.util.zip.GZIPInputStream(bytein);
    java.io.ByteArrayOutputStream byteout = new java.io.ByteArrayOutputStream();
    int res = 0;
    byte buf[] = new byte[1024];
    while (res >= 0) {
        res = gzin.read(buf, 0, buf.length);
        if (res > 0) {
            byteout.write(buf, 0, res);
        }
    }
    byte uncompressed[] = byteout.toByteArray();
    return (uncompressed.toString());
}


क्षमा करें, मैं स्ट्रिंग को बाईट्रेयर और बैक में परिवर्तित करने का प्रयास कर रहा हूं और गलत परिणाम प्राप्त कर रहा हूं। मैं इसे थोड़ी देर में संपादित करूँगा और वापस आ जाऊँगा।
एमकेएल आरजेवी

8
आपकी समस्या यह है कि String.getBytes()वास्तव में एक बाइट सरणी वापस करता है, लेकिन toString()एक बाइट सरणी के एक उपयोगी परिणाम वापस आ जाएगा कि आपका विश्वास गलत है।
लुई वासरमैन

जवाबों:


948

आपके विधि की decompressGZIP()जरूरत वस्तु एक है byte[]

तो आपके द्वारा पूछे गए प्रश्न का मूल, तकनीकी उत्तर है:

byte[] b = string.getBytes();
byte[] b = string.getBytes(Charset.forName("UTF-8"));
byte[] b = string.getBytes(StandardCharsets.UTF_8); // Java 7+ only

हालाँकि आप जिस समस्या से जूझ रहे हैं, वह यह है कि यह बहुत अच्छी तरह से प्रदर्शित नहीं होती है। कॉलिंग toString()आपको केवल डिफ़ॉल्ट देगी Object.toString()जो कि क्लास का नाम + मेमोरी एड्रेस है। आपके परिणाम में [B@38ee9f13, [Bसाधन byte[]और 38ee9f13एक द्वारा अलग किए गए मेमोरी एड्रेस है @

प्रदर्शन प्रयोजनों के लिए आप उपयोग कर सकते हैं:

Arrays.toString(bytes);

लेकिन यह सिर्फ अल्पविराम से अलग किए गए पूर्णांकों के अनुक्रम के रूप में प्रदर्शित होगा, जो आप चाहते हैं या नहीं हो सकता है।

एक Stringसे वापस पढ़ने योग्य पाने के लिए byte[], उपयोग करें:

String string = new String(byte[] bytes, Charset charset);

Charsetसंस्करण का पक्ष लेने का कारण यह है कि Stringजावा में सभी वस्तुओं को आंतरिक रूप से UTF-16 के रूप में संग्रहीत किया जाता है। जब byte[]आप को परिवर्तित करने के Stringलिए चुने हुए चारसेट के आधार पर, दिए गए ग्लाइफ़्स के लिए बाइट्स का एक अलग ब्रेकडाउन मिलेगा ।


26
string.getBytes ("UTF-8") को UnsupportedEncodingException को संभालने की आवश्यकता है, जबकि string.getBytes (Charset.forName ("UTF-8") नहीं करता है। तर्क करना कि कौन सी विधि "बेहतर" है, मैं पाठक के लिए एक अभ्यास के रूप में छोड़ता हूं।
माइकल वार्नर

20
string.getBytes(StandardCharsets.UTF_8)भी इस्तेमाल किया जा सकता है, और यह उसी तरह है जैसेstring.getBytes(Charset.forName("UTF-8"))
बहादुर यारान

3
मेरा मानना StandardCharsetsहै कि जावा 7 के साथ नया है
स्टीवर्ट

2
मुझे समझ में नहीं आ रहा है कि इस उत्तर को इतने उभार क्यों मिले। यह सही हो सकता है, लेकिन यह बहुत उपयोगी नहीं है ... कोड की कुछ पंक्तियाँ, जिनमें से अधिकांश में ओपी पहले से ही था, और यह नहीं समझा रहा है कि क्या फर्क Charset.forName("UTF-8")पड़ता है या क्यों महत्वपूर्ण है।
लार्स

3
@LarsH आप एक अच्छी बात करते हैं। सच कहूं, तो मैंने कभी भी इस जवाब की उम्मीद नहीं की थी कि यह लोकप्रिय होगा। मैंने अब उत्तर को "लायक" बनाने के लिए विस्तार किया है। उम्मीद है कि इसमें सुधार होगा।
स्टीवर्ट


14

String.getBytes () का उपयोग करने का प्रयास करें। यह एक बाइट देता है [] स्ट्रिंग डेटा का प्रतिनिधित्व करता है। उदाहरण:

String data = "sample data";
byte[] byteData = data.getBytes();

14

सीधे शब्दों में:

String abc="abcdefghight";

byte[] b = abc.getBytes();

क्या होगा यदि abcगैर यूएस-एएससीआईआई अक्षर, जैसे "greater than 2³² − 1"या केवल द्विआधारी डेटा (जैसे " A nonb2") हो?
यू। विंडल

यह ऐसे वर्णों के लिए काम नहीं करता है जैसे इस स्ट्रिंग में केवल 5 वर्ण हैं। हालाँकि जब मैं उपयोग करता getBytes()हूँ तो मुझे 7 अक्षर मिलते हैं।
Teocci



1

जावा को स्ट्रिंग पैरामीटर के रूप में बदलना आवश्यक नहीं है। आपको एक सूचक के बिना स्ट्रिंग प्राप्त करने के लिए सी कोड को बदलना होगा और इसके कोड में:

Bool DmgrGetVersion (String szVersion);

Char NewszVersion [200];
Strcpy (NewszVersion, szVersion.t_str ());
.t_str () applies to builder c ++ 2010

1

मुझे पता है कि मैं थोड़ा देर से पार्टी कर रहा हूँ, लेकिन यह बहुत साफ है (हमारे प्रोफेसर ने हमें दिया)

public static byte[] asBytes (String s) {                   
           String tmp;
           byte[] b = new byte[s.length() / 2];
           int i;
           for (i = 0; i < s.length() / 2; i++) {
             tmp = s.substring(i * 2, i * 2 + 2);
             b[i] = (byte)(Integer.parseInt(tmp, 16) & 0xff);
           }
           return b;                                            //return bytes
    }

1
यह हेक्स-एन्कोडेड बाइट सरणी को डिकोड करता है। इस प्रश्न के बारे में कुछ बहुत अलग है।
पलक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.