জাভা বাইট অ্যারে থেকে স্ট্রিং টু বাইট অ্যারে


180

আমি বাইটকে [] স্ট্রিংয়ে বোঝার চেষ্টা করছি, বাইটের স্ট্রিং উপস্থাপনা [] বাইটে [] রূপান্তর ... আমি আমার বাইটকে [] পাঠাতে একটি স্ট্রিংয়ে রূপান্তর করি, তারপরে আমি আমার ওয়েব পরিষেবা প্রত্যাশা করি (পাইথনে লেখা) সরাসরি ক্লায়েন্টের কাছে ডেটা প্রতিধ্বনি করতে।

আমি যখন আমার জাভা অ্যাপ্লিকেশন থেকে ডেটা প্রেরণ করি ...

Arrays.toString(data.toByteArray())

বাইট পাঠাতে ..

[B@405217f8

প্রেরণ করুন (এটি অ্যারে.টো স্ট্রিংয়ের ফলাফল) যা আমার বাইট ডেটার স্ট্রিং উপস্থাপনা হওয়া উচিত, এই ডেটাটি তারে জুড়ে প্রেরণ করা হবে):

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

এগুলি উভয়ই আমার প্রেরিত ডেটা থেকে পৃথক ... আমি নিশ্চিত যে আমি সত্যিই সাধারণ কিছু মিস করছি ...

কোন সাহায্য?!

উত্তর:


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);

** সম্পাদনা করুন **

আপনি আপনার প্রশ্নের মধ্যে আপনার সমস্যার একটি ইঙ্গিত পেয়েছেন, যেখানে আপনি " 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), এই কোডটি এই উত্তরের প্রথম স্নিপেটে আমি পেস্ট করেছি।


অসাধারণ! আমি মনে করি আমি পরে কী ছিল তা আপনি পুরোপুরি বুঝতে পেরেছি ... আমি জাভা ব্যাকগ্রাউন্ড থেকে নেই, তাই আমার যে রূপান্তরটি দরকার তা আমি সত্যিই বুঝতে পারি না। কেবল তথ্যের জন্য, আমি সার্ভারে এস 1 প্রেরণ করছি, এবং সার্ভারটি এস 1 এর সাথে জবাব দিচ্ছে (আমি যাচাই করতে পারি যে সার্ভারটি এস 1-এর সাথে ডেটা পেয়েছে এবং জবাব দিয়েছে), সুতরাং আমার অ্যারেস.টোস্ট্রিংয়ের বিপরীতে দরকার ছিল () আপনি প্রস্তাব দিয়েছেন ... এবং আপনার সমাধানটি বেশ সুন্দর সুন্দর! চিয়ার্স!
0909 ইএম

ধন্যবাদ ইয়ানিক তবে এটি প্রতিটি চিত্রের জন্য 2046 বারের জন্য লুপ করে কারণ বাইটস দৈর্ঘ্যের মান 2046 হয় this এটি করার জন্য অন্য কোনও পদ্ধতি আছে কি?
গুগান

আপনি যে ডেটা গ্রহণ করছেন তা যদি সত্যিই কোনও মানব পাঠযোগ্য স্ট্রিং থাকে যা responseআমার উত্তরে পরিবর্তনকের মানের মতো পার্স করা দরকার , তবে দুর্ভাগ্যক্রমে না, অন্য কোনও উপায় নেই। আপনার পক্ষে স্ট্রিটের পরিবর্তে কাঁচা ডেটা (বাইনারি হিসাবে) বা সম্ভবত বেস 64 স্ট্রিং হিসাবে বাইটগুলি গ্রহণ করার পক্ষে সর্বোত্তম উপায় হ'ল এটি আপনাকে কেবল 256 (বাইনারি) মান হিসাবে ফিরে রূপান্তর করতে হবে।
ইয়ানিক রচন

3
অন্যথায় একটি সঠিক (অসম্পূর্ণ হলেও) উত্তরটি যুক্ত করতে: 1) জাভাতে কোনও বাইট [] অ্যারে স্ট্রিংয়ে রূপান্তরিত হচ্ছে অক্ষর সেটটি নির্দিষ্ট করে specify বাইটটি [] অ্যারে ইউটিএফ -8 বা অন্য কিছু? সুনির্দিষ্ট না হওয়া বা এটি কী তা জানার ফলে বাগ তৈরি হতে পারে। 2) জাভা বিগ-এন্ডিয়ান এনকোডিং ব্যবহার করে তবে এম $ সিস্টেমগুলি উদাহরণস্বরূপ লিটল-এন্ডিয়ান ব্যবহার করে। স্ট্রিংগুলি (চরিত্রভিত্তিক) বাইট [] অ্যারেগুলির সাথে কাজ করার সময়, এটি কোনও সমস্যা নয়। তবে, বাইট [] অ্যারে যদি কোনও সংখ্যার প্রতিনিধিত্ব করে তবে উত্স / টার্গেট সিস্টেমগুলির 'শেষত্ব' গুরুত্বপূর্ণ।
ড্যারেল টিগু

130
String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

এটি কনসোলে "শীতল স্ট্রিং" আউটপুট করে।

এটা বেশ সুন্দর সহজ।


6
অনেক ডাউনভোটস, তবে খুব কম ব্যাখ্যা ... আমি যা বলেছিলাম তা কি কাজ করে না? আমি এটি ব্যবহার করার সময় এটি কাজ করেছিল, এবং প্রশ্নটি কীভাবে বাইট থেকে স্ট্রিংয়ে রূপান্তর করা যায় এবং আবার ফিরে আসে, ডান?
CorayThan

2
যে উত্তরটি সমাধান করেছে তা আসলে উত্তর হিসাবে চিহ্নিত হয়েছে। স্মৃতি থেকে আপনি প্রস্তাবিত মত সহজ নয় ... ইয়ানিকের উত্তর দেখুন, আমি মনে করি আপনি যা জিজ্ঞাসা করছেন তা ভুল বুঝেছেন তবে ইনপুটটির জন্য ধন্যবাদ।
0909 ই এম

9
@ কোরাইথান আসলে না, এটি ওপি-র প্রশ্নের মোটেই সমাধান করে না। আপনি যদি সত্যই এটির মাধ্যমে পড়ে থাকেন তবে আপনি দেখতে পাবেন যে byte[]তিনি যে গ্রহণ করছেন তা একজন হিসাবে উপস্থাপিত হয়েছে String; অর্থাৎ "[97, 98, 99]"না [97, 98, 99]। অর্থ, আপনার উত্তর এমনকি এই পরিস্থিতিতে প্রযোজ্য না।
b1nary.atr0phy

2
আপনার উত্তর হয় Stringকরার byte[]জন্য String। আমার মনে প্রশ্ন প্রয়োজন byte[]থেকে Stringকরা byte[]
উন্ডউইন জন্ম

13
জিজ্ঞাসা করা প্রশ্নের জন্য এমনকি ভুল প্রতিক্রিয়া হতে পারে, তবে এটি আমাকে সমস্যার সমাধান করতে সহায়তা করেছে। এ কারণেই কারওর জবাব ডাউনগ্রেড করার আগে লোকেরা কিছুটা বেশি চিন্তা করা উচিত। আপনাকে ধন্যবাদ CorayThan!
রবার্তো সান্টোস

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://evirtythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html


2
না, আপনি প্রশ্নটি পড়েননি বা সম্ভবত আপনি সমস্যাটি বুঝতে পারেন নি। আপনি যেমন লক্ষ করবেন যে প্রশ্নগুলি বছর আগে উত্তর দেওয়া হয়েছিল ...
0909 ম

3

আপনার বাইট অ্যারে ( [B@405217f8) থেকে আপনি যে ধরণের আউটপুট দেখছেন তাও শূন্য দৈর্ঘ্যের বাইট অ্যারে (অর্থাত new byte[0]) এর আউটপুট । দেখে মনে হচ্ছে এই স্ট্রিংটি অ্যারের বিষয়বস্তুর বর্ণনার চেয়ে অ্যারেরের জন্য একটি রেফারেন্স, যেমন আমরা নিয়মিত সংগ্রহের toString()পদ্ধতি থেকে আশা করতে পারি ।

অন্যান্য উত্তরদাতাদের মতো, আমি আপনাকে সেই Stringকনস্ট্রাক্টরগুলিকে নির্দেশ করব যা byte[]বাইট অ্যারের সামগ্রীতে স্ট্রিং তৈরি করতে কোনও পরামিতি গ্রহণ করে । আপনি InputStreamযদি কোনও টিসিপি সংযোগ থেকে বাইট পেতে চান তবে আপনার সকেটের কাছ থেকে কাঁচা বাইটগুলি পড়তে সক্ষম হওয়া উচিত ।

আপনি যদি ইতিমধ্যে সেই বাইটগুলি একটি String(ব্যবহার করে InputStreamReader) হিসাবে পড়ে থাকেন তবে, স্ট্রিংটি getBytes()ফাংশনটি ব্যবহার করে বাইটে রূপান্তর করা যায় । আপনার পছন্দসই চরিত্রটি স্ট্রিং কনস্ট্রাক্টর এবং getBytes()ফাংশন উভয়কেই সরিয়ে দেওয়ার বিষয়ে নিশ্চিত হন এবং বাইট ডেটা দ্বারা অক্ষরে রূপান্তর করা সম্ভব হলে এটি কাজ করবে InputStreamReader

আপনি যদি কাঁচা বাইটগুলি ব্যবহার করতে চান তবে আপনার এই স্ট্রিম রিডার স্তরটি ব্যবহার করা উচিত really


2

আপনি কি কেবল বাইটসকে বাইট হিসাবে প্রেরণ করতে পারবেন না, বা প্রতিটি বাইটকে একটি চরিত্রে রূপান্তর করতে এবং স্ট্রিং হিসাবে প্রেরণ করতে পারবেন না? আপনি যেমন করছেন তেমন স্ট্রিংয়ে সর্বনিম্ন 85 টি অক্ষর গ্রহণ করা হবে, যখন আপনার কাছে কেবল 11 বাইট পাঠাতে হবে। আপনি বাইটগুলির একটি স্ট্রিং উপস্থাপনা তৈরি করতে পারেন, সুতরাং এটি "[B @ 405217f8" হবে, যা পাইথনের অনায়াসে bytesবা bytearrayবস্তুতে সহজেই রূপান্তরিত হতে পারে । যে ব্যর্থ, আপনি তাদের ( "5b42403430353231376638") হেক্সাডেসিমেল সংখ্যার একটি সিরিজের অংশ হিসাবে প্রতিনিধিত্ব করতে পারে 22 অক্ষর, যা খুব সহজেই ব্যবহার পাইথন পাশ সঙ্কেতমুক্ত যেতে পারে গ্রহণ binascii.unhexlify()


1
[B@405217f8অ্যারের জাভা অবজেক্ট আইডি, অ্যারের সামগ্রী নয়। অবজেক্ট আইডি অবশ্যই "পাইথনের বাইট্রে বা বাইটেরায় অবজেক্টে সহজেই রূপান্তরিত হতে পারে না "। আকার অনুসারে আপনি সবচেয়ে ভাল করতে পারেন বাইট [] কে বেস 64 স্ট্রিংয়ে রূপান্তর করা।
বরিস বি

আপনি সঠিক, আমি নির্দ্বিধায় 0909E ধরে ধরেছিলাম যে কোনও অবজেক্টের (টাইপ করা) ঠিকানা এবং অবজেক্টের বিষয়বস্তুর মধ্যে পার্থক্য করার পক্ষে যথেষ্ট পরিমাণে জানা ছিল।
জ্যাব


1

আপনি যদি স্ট্রিংটিকে আবার বাইট অ্যারে রূপান্তর করতে চান তবে আপনাকে String.getBytes()(বা সমকক্ষ পাইথন ফাংশন) ব্যবহার করতে হবে এবং এটি আপনাকে মূল বাইট অ্যারে মুদ্রণ করতে দেয়।


0

বাইটোকোডটিকে স্ট্রিং হিসাবে বাইট অ্যারেতে রূপান্তর করতে নীচের কোড API ব্যবহার করুন।

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

-1

[জাভা ৮]

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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.