java - बाइट ऐरे को स्ट्रिंग करने के लिए जावा बाइट ऐरे




string byte (7)

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

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

Arrays.toString(data.toByteArray())

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

[[email protected]

भेजें (यह 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]

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

[email protected]

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

कोई मदद?!


[JDK8]

import java.util.Base64;

तार:

String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });

बाइट सरणी के लिए:

byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");

आप केवल लौटाई स्ट्रिंग नहीं ले सकते हैं और इससे एक स्ट्रिंग बना सकते हैं ... यह अब 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);

** संपादित करें **

आपको अपने प्रश्न में आपकी समस्या का संकेत मिलता है, जहां आप कहते हैं " 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 में सरणी b1 की स्ट्रिंग प्रस्तुति होती है, जबकि s2 में b1 में निहित बाइट्स का स्ट्रिंग प्रस्तुतीकरण होता है।

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


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

कृपया एपीआई दस्तावेज Arrays API की जांच करें

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


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


बाइट सरणी में स्ट्रिंग के रूप में बाइटकोड को कन्वर्ट करने के लिए नीचे कोड API का उपयोग करें।

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

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

ग्राहकों को वापस:

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== 

String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

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

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






byte