जावा बाइट ऐरे से स्ट्रिंग बाइट तक


180

मैं बाइट [] को स्ट्रिंग, बाइट के स्ट्रिंग प्रतिनिधित्व [] को बाइट [] रूपांतरण में समझने की कोशिश कर रहा हूं ... मैं अपनी बाइट [] को स्ट्रिंग में भेज देता हूं, मैं अपनी वेब सेवा (अजगर में लिखित) की उम्मीद करता हूं ग्राहक को सीधे डेटा वापस करने के लिए।

जब मैं अपने जावा एप्लिकेशन से डेटा भेजता हूं ...

Arrays.toString(data.toByteArray())

भेजने के लिए बाइट्स ..

[B@405217f8

भेजें (यह Arrays.toString () का परिणाम है जो मेरे बाइट डेटा का एक स्ट्रिंग प्रतिनिधित्व होना चाहिए, यह डेटा तार भर में भेजा जाएगा):

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

अजगर की तरफ, अजगर सर्वर कॉलर को एक स्ट्रिंग लौटाता है (जो मैं देख सकता हूं, वही है जो स्ट्रिंग मैंने सर्वर को भेजा था

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

सर्वर को ग्राहक को यह डेटा वापस करना चाहिए, जहां इसे सत्यापित किया जा सकता है।

मेरे मुवक्किल की प्रतिक्रिया (एक स्ट्रिंग के रूप में) मिलती है

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

मुझे यह पता नहीं लग सकता है कि प्राप्त स्ट्रिंग को बाइट में वापस कैसे लाया जाए []

जो कुछ भी मैं कोशिश करता हूं मुझे एक बाइट सरणी मिल रही है जो इस प्रकार दिखता है ...

[91, 45, 52, 55, 44, 32, 49, 44, 32, 49, 54, 44, 32, 56, 52, 44, 32, 50, 44, 32, 49, 48, 49, 44, 32, 49, 49, 48, 44, 32, 56, 51, 44, 32, 49, 49, 49, 44, 32, 49, 48, 57, 44, 32, 49, 48, 49, 44, 32, 51, 50, 44, 32, 55, 56, 44, 32, 55, 48, 44, 32, 54, 55, 44, 32, 51, 50, 44, 32, 54, 56, 44, 32, 57, 55, 44, 32, 49, 49, 54, 44, 32, 57, 55, 93]

या मुझे एक बाइट प्रतिनिधित्व मिल सकता है जो इस प्रकार है:

B@2a80d889

ये दोनों मेरे भेजे गए डेटा से अलग हैं ... मुझे यकीन है कि Im कुछ सही मायने में सरल याद कर रहा है ...।

कोई मदद?!

जवाबों:


272

आप केवल लौटी स्ट्रिंग नहीं ले सकते हैं और उससे एक स्ट्रिंग का निर्माण कर सकते हैं ... यह byte[]अब डेटा प्रकार नहीं है, यह पहले से ही एक स्ट्रिंग है; आपको इसे पार्स करने की आवश्यकता है। उदाहरण के लिए :

String response = "[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]";      // response from the Python script

String[] byteValues = response.substring(1, response.length() - 1).split(",");
byte[] bytes = new byte[byteValues.length];

for (int i=0, len=bytes.length; i<len; i++) {
   bytes[i] = Byte.parseByte(byteValues[i].trim());     
}

String str = new String(bytes);

** EDIT **

आपको अपने प्रश्न में आपकी समस्या का संकेत मिलता है, जहाँ आप कहते हैं " Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ...", क्योंकि 91बाइट मान है [, इसलिए [91, 45, ...स्ट्रिंग " [-45, 1, 16, ..." स्ट्रिंग का बाइट है ।

विधि Arrays.toString()एक वापस आ जाएगी Stringनिर्दिष्ट सरणी का प्रतिनिधित्व; इसका अर्थ है कि लौटाया गया मान अब कोई सरणी नहीं होगा। उदाहरण के लिए :

byte[] b1 = new byte[] {97, 98, 99};

String s1 = Arrays.toString(b1);
String s2 = new String(b1);

System.out.println(s1);        // -> "[97, 98, 99]"
System.out.println(s2);        // -> "abc";

आप देख सकते हैं, s1की स्ट्रिंग प्रतिनिधित्व रखती सरणी b1 , जबकि s2की स्ट्रिंग प्रतिनिधित्व रखती बाइट्स में निहित b1

अब, आपकी समस्या में, आपका सर्वर स्ट्रिंग के समान देता है s1, इसलिए सरणी प्रतिनिधित्व वापस पाने के लिए, आपको विपरीत निर्माण विधि की आवश्यकता है। यदि s2.getBytes()इसके विपरीत है new String(b1), तो आपको इसके विपरीत खोजने की आवश्यकता है Arrays.toString(b1), इस प्रकार इस उत्तर के पहले स्निपेट में मैंने जो कोड चिपकाया है।


बहुत बढ़िया! मुझे लगता है कि आप पूरी तरह से समझ गए हैं कि मैं क्या था ... मैं एक जावा बैकग्राउंड से नहीं हूं, इसलिए मैं वास्तव में उस रूपांतरण का पता नहीं लगा सका जिसकी मुझे जरूरत थी। बस जानकारी के लिए, मैं सर्वर को s1 भेज रहा हूं, और सर्वर s1 के साथ उत्तर दे रहा है (मैं सत्यापित कर सकता हूं कि प्राप्त सर्वर और s1 में डेटा के साथ उत्तर दिया गया है), इसलिए मुझे Arrays.toString () के विपरीत की आवश्यकता थी आपने सुझाव दिया ... और आपका समाधान बहुत अच्छा है! चीयर्स!
0909EM

धन्यवाद यानिक। लेकिन यह प्रत्येक छवि के लिए बाइट्स के मान के रूप में 2046 बार लूप करता है। गति 2046 है। क्या ऐसा करने के लिए कोई अन्य तरीका है?
गुगन

यदि आप जो डेटा प्राप्त कर रहे हैं वह वास्तव में एक मानव पठनीय स्ट्रिंग है जिसे responseमेरे उत्तर में चर के मूल्य की तरह पार्स करने की आवश्यकता है , तो दुर्भाग्य से नहीं, कोई अन्य तरीका नहीं है। सबसे अच्छा तरीका यह होगा कि आप स्ट्रिंग के बजाय बाइट्स को कच्चे डेटा के रूप में (बाइनरी के रूप में) या शायद बेस 64 स्ट्रिंग के रूप में प्राप्त करें, जिसके लिए आपको केवल आधार 256 (बाइनरी) मान के रूप में इसे वापस बदलना होगा।
यानिक रोचॉन

3
जोड़ने के लिए अन्यथा एक सही (यद्यपि अधूरा) उत्तर है: 1) किसी भी बाइट [] सरणी को जावा में स्ट्रिंग में परिवर्तित किया जाना चाहिए, चरित्र-सेट निर्दिष्ट करना चाहिए। क्या बाइट [] सरणी UTF-8 या कुछ और है? विशिष्ट नहीं होना या यह जानना कि यह क्या बग पैदा कर सकता है। 2) जावा बिग-एंडियन एन्कोडिंग का उपयोग करता है लेकिन उदाहरण के लिए एम $ सिस्टम लिटिल-एंडियन का उपयोग करते हैं। जब बाइट [] सरणियों के साथ काम करते हैं जो स्ट्रिंग्स (चरित्र आधारित) होते हैं, तो यह कोई समस्या नहीं है। हालाँकि, यदि बाइट [] सरणी एक संख्या का प्रतिनिधित्व करती है, तो स्रोत / लक्ष्य प्रणालियों की 'एंडियननेस' मायने रखती है।
डेरेल टेग

130
String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

यह कंसोल को "कूल स्ट्रिंग" आउटपुट करता है।

यह बहुत आसान है।


6
इतने सारे डाउनवोट, लेकिन इतने सारे स्पष्टीकरण ... क्या मैंने कहा कि काम नहीं करता है? यह काम किया जब मैंने इसे इस्तेमाल किया, और सवाल यह है कि बाइट्स को स्ट्रिंग्स में कैसे बदला जाए और फिर से, सही?
कोरयथन

2
इसका उत्तर देने वाला उत्तर वास्तव में उत्तर के रूप में चिह्नित किया गया है। मेमोरी से यह उतना आसान नहीं है जितना आपने सुझाया है ... यानिक का जवाब देखें, मुझे लगता है कि आपने गलत समझा है कि मैं क्या पूछ रहा था, लेकिन इनपुट के लिए धन्यवाद।
0909EM

9
@CorayThan वास्तव में नहीं, यह ओपी के प्रश्न को बिल्कुल भी संबोधित नहीं करता है। यदि आप वास्तव में इसे पढ़ते हैं, तो आप देखेंगे कि byte[]वह जो प्राप्त कर रहा है उसे एक के रूप में दर्शाया गया है String; यानी "[97, 98, 99]"नहीं [97, 98, 99]। मतलब, आपका जवाब इस स्थिति पर भी लागू नहीं होता है।
b1nary.atr0phy

2
आपका जवाब है Stringकरने के लिए byte[]करने के लिए String। मुझे लगता है कि सवाल आवश्यकता है byte[]करने के लिए Stringकरने के लिए byte[]
वुंडविन का जन्म

13
यहां तक ​​कि पूछे गए प्रश्न के लिए गलत प्रतिक्रिया भी हो सकती है, लेकिन इससे मुझे एक समस्या को हल करने में मदद मिली। यही कारण है कि लोगों को किसी और के जवाब को अपग्रेड करने से पहले थोड़ा और सोचना चाहिए। धन्यवाद कोरयथन!
रॉबर्टो सैंटोस

21

मैंने क्या किया:

ग्राहकों को लौटें:

byte[] result = ****encrypted data****;

String str = Base64.encodeBase64String(result);

return str;

ग्राहकों से प्राप्त:

 byte[] bytes = Base64.decodeBase64(str);

आपका डेटा इस प्रारूप में स्थानांतरित कर दिया जाएगा:

OpfyN9paAouZ2Pw+gDgGsDWzjIphmaZbUyFx5oRIN1kkQ1tDbgoi84dRfklf1OZVdpAV7TonlTDHBOr93EXIEBoY1vuQnKXaG+CJyIfrCWbEENJ0gOVBr9W3OlFcGsZW5Cf9uirSmx/JLLxTrejZzbgq3lpToYc3vkyPy5Y/oFWYljy/3OcC/S458uZFOc/FfDqWGtT9pTUdxLDOwQ6EMe0oJBlMXm8J2tGnRja4F/aVHfQddha2nUMi6zlvAm8i9KnsWmQG//ok25EHDbrFBP2Ia/6Bx/SGS4skk/0couKwcPVXtTq8qpNh/aYK1mclg7TBKHfF+DHppwd30VULpA== 

7

क्या Arrays.toString()आपकी बाइट में प्रत्येक व्यक्ति बाइट का एक स्ट्रिंग प्रतिनिधित्व बनाता है।

कृपया एपीआई प्रलेखन की जाँच करें एपीआई

अपनी प्रतिक्रिया स्ट्रिंग को मूल बाइट सरणी में split(",")बदलने के लिए, आपको कुछ या कुछ का उपयोग करना होगा और इसे एक संग्रह में बदलना होगा और फिर अपने बाइट सरणी को फिर से बनाने के लिए प्रत्येक व्यक्तिगत आइटम को एक बाइट में परिवर्तित करना होगा।


5

जावा में बाइट सरणी को स्ट्रिंग और स्ट्रिंग बैक बाइट सरणी में बदलने के लिए सरल है। हमें यह जानना होगा कि सही तरीके से 'नए' का उपयोग कब किया जाए। इसे निम्नानुसार किया जा सकता है:

बाइट सरणी से स्ट्रिंग रूपांतरण:

byte[] bytes = initializeByteArray();
String str = new String(bytes);

स्ट्रिंग बाइट रूपांतरण में स्ट्रिंग:

String str = "Hello"
byte[] bytes = str.getBytes();

अधिक जानकारी के लिए, यहां देखें: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html


2
नहीं, आपने प्रश्न नहीं पढ़ा है या शायद आपने समस्या को नहीं समझा है। जैसा कि आप ध्यान देंगे कि इस सवाल का जवाब सालों पहले दिया गया था ...
0909EM

3

अपने बाइट सरणी ( [B@405217f8) से आप जिस प्रकार का आउटपुट देख रहे हैं, वह शून्य लंबाई बाइट सरणी (यानी new byte[0]) के लिए भी आउटपुट है । ऐसा लगता है कि यह स्ट्रिंग सरणी की सामग्री के विवरण के बजाय सरणी का संदर्भ है जैसे हम एक नियमित संग्रह से उम्मीद कर सकते हैंtoString() विधि ।

अन्य उत्तरदाताओं के साथ, मैं आपको इंगित करता हूं String करूंगा जो byte[]एक बाइट सरणी की सामग्री से एक स्ट्रिंग बनाने के लिए एक पैरामीटर को स्वीकार करते हैं। आपको सॉकेट से कच्चे बाइट्स पढ़ने में सक्षम होना चाहिएInputStreamयदि आप एक टीसीपी कनेक्शन से बाइट्स प्राप्त करना चाहते हैं तो आपको ।

यदि आपने पहले ही उन बाइट्स को एक String(का उपयोग करके InputStreamReader) के रूप में पढ़ा है , तो, स्ट्रिंग का उपयोग करके बाइट में परिवर्तित किया जा सकता हैgetBytes() फ़ंक्शन । स्ट्रिंग कंस्ट्रक्टर और getBytes()फ़ंक्शंस दोनों के लिए अपने इच्छित वर्ण में पास होना सुनिश्चित करें , और यह केवल तभी काम करेगा जब बाइट डेटा को वर्णों में परिवर्तित किया जा सके InputStreamReader

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


2

क्या आप केवल बाइट्स को बाइट्स के रूप में नहीं भेज सकते हैं, या प्रत्येक बाइट को एक चरित्र में बदल सकते हैं और एक स्ट्रिंग के रूप में भेज सकते हैं? ऐसा करने से आप स्ट्रिंग में न्यूनतम 85 अक्षर लेंगे, जब आपके पास भेजने के लिए केवल 11 बाइट्स होंगे। आप बाइट्स का एक स्ट्रिंग प्रतिनिधित्व बना सकते हैं, इसलिए यह "[B @ 405217f8" होगा, जिसे आसानी से पायथन में किसी ऑब्जेक्ट bytesया bytearrayऑब्जेक्ट में परिवर्तित किया जा सकता है । असफल होने पर, आप उन्हें 22 वर्णों तक ले जाने वाले हेक्साडेसिमल अंकों ("5b42403430353231376638") की एक श्रृंखला के रूप में प्रतिनिधित्व कर सकते हैं, जिसका उपयोग करके आसानी से पायथन पक्ष पर डिकोड किया जा सकता है binascii.unhexlify()


1
[B@405217f8सरणी की जावा ऑब्जेक्ट आईडी है, सरणी की सामग्री नहीं। ऑब्जेक्ट आईडी निश्चित रूप से "आसानी से बाइट में परिवर्तित नहीं किया जा सकता है या अजगर में बाइटियर ऑब्जेक्ट"। सबसे अच्छा आप आकार-वार कर सकते हैं जो बाइट [] को बेस 64 स्ट्रिंग में परिवर्तित कर सकता है।
बोरिस बी।

आप सही हैं, मैंने माना है कि किसी वस्तु और वस्तु की सामग्री के पते (टाइप किए गए) के बीच अंतर करने के लिए 0909EM पर्याप्त रूप से जानता था।
JAB


1

यदि आप स्ट्रिंग को एक बाइट सरणी में बदलना चाहते हैं तो आपको String.getBytes()(या समकक्ष पायथन फ़ंक्शन) का उपयोग करना होगा और यह आपको मूल बाइट सरणी को प्रिंट करने की अनुमति देगा।


0

Bytecode को बाइट सरणी में बदलने के लिए नीचे दिए गए कोड एपीआई का उपयोग करें।

 byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");

-1

[जावा 8]

import java.util.Base64;

String dummy= "dummy string";
byte[] byteArray = dummy.getBytes();

byte[] salt = new byte[]{ -47, 1, 16, ... }
String encoded = Base64.getEncoder().encodeToString(salt);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.