java - অবজ - জাভা সুইং




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

[JDK8]

import java.util.Base64;

স্ট্রিং:

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

বাইট অ্যারে:

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

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

যখন আমি আমার জাভা অ্যাপ্লিকেশন থেকে তথ্য পাঠাতে ...

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]

এই দুটি আমার পাঠানো ডেটা থেকে ভিন্ন ... আমি নিশ্চিত যে আমি সত্যিই কিছু সহজ অনুপস্থিত ....

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


[জাভা 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);

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


আপনি শুধুমাত্র ফিরে স্ট্রিংটি নিতে এবং এটি থেকে একটি স্ট্রিং গঠন করতে পারবেন না ... এটি একটি 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) s2.getBytes() এর বিপরীত হয় তবে আপনাকে s2.getBytes() new String(b1) Arrays.toString(b1) 1 Arrays.toString(b1) এর Arrays.toString(b1) খুঁজে বের করতে হবে, এইভাবে আমি এই উত্তরটির প্রথম স্নিপেটে যে কোডটি Arrays.toString(b1)


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

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

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


Arrays.toString() আপনার বাইটএরে প্রতিটি পৃথক বাইটের একটি স্ট্রিং উপস্থাপনা তৈরি করে।

এপিআই ডকুমেন্টেশন অ্যারে API চেক করুন

আপনার প্রতিক্রিয়া স্ট্রিংকে মূল বাইট অ্যারে রূপান্তর করতে, আপনাকে split(",") বা কিছু ব্যবহার করতে হবে এবং এটি একটি সংগ্রহের মধ্যে রূপান্তর করতে হবে এবং তারপরে আপনার বাইট অ্যারে পুনরায় তৈরি করতে প্রতিটি পৃথক আইটেমটি বাইটে রূপান্তর করতে হবে।


String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

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

এটা সুন্দর darn সহজ।





byte