জাভা স্ট্রিংকে কীভাবে বাইটে রূপান্তর করবেন []?


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

এবং আমি আলাদা আউটপুট পাচ্ছি। এটি জিপিপ স্ট্রিং হওয়ায় প্রথম আউটপুট প্রদর্শন করতে অক্ষম।

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

দ্বিতীয়টি একটি ঠিকানা। আমি কি ভুল করছি কিছু আছে? byte[]এটি gzip decompressor এ খাওয়ানোর জন্য আমার একটি ফলাফলের প্রয়োজন যা নীচের মত।

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()বাইট অ্যারের কোনও কার্যকর ফলাফল ফিরে আসবে ভুল is
লুই ওয়াসারম্যান

উত্তর:


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জাভাতে সমস্ত বস্তু অভ্যন্তরীণভাবে ইউটিএফ -16 হিসাবে সংরক্ষণ করা হয়। যখন কোনও রূপান্তরিত হয় byte[]আপনি Stringনির্বাচিত চরসেটের উপর নির্ভর করে এর প্রদত্ত গ্লাইফগুলির জন্য বাইটের আলাদা ব্রেকডাউন পাবেন ।


26
string.getBytes ("UTF-8") এর জন্য একটি অসমর্থিত এনকোডিংএক্সেপশন হ্যান্ডেল করা দরকার, যখন স্ট্রিং.জেটবাইটস (চরসেট.ফোর্নাম ("ইউটিএফ -8")) দেয় না। কোন পদ্ধতিটি "আরও ভাল" তা নিয়ে তর্ক করা আমি পাঠকের অনুশীলন হিসাবে ছেড়ে চলেছি।
মাইকেল ওয়ার্নার

20
string.getBytes(StandardCharsets.UTF_8)এছাড়াও ব্যবহার করা যেতে পারে, এবং এটি একইstring.getBytes(Charset.forName("UTF-8"))
বাহাদুর ইয়ায়ান

3
আমি বিশ্বাস করি StandardCharsetsজাভা 7
স্টুয়ার্ট

2
আমি বুঝতে পারছি না কেন এই উত্তরটি এতগুলি উত্সাহ পেল। এটি সঠিক হতে পারে তবে এটি খুব সহায়ক নয় ... কেবল কয়েকটি কোডের কয়েকটি লাইন, যার বেশিরভাগ ওপি ইতিমধ্যে ছিল এবং কী পার্থক্য Charset.forName("UTF-8")তৈরি করে বা এটি গুরুত্বপূর্ণ কেন তা ব্যাখ্যা না করে ।
LarsH

3
@ লার্শ আপনি একটি ভাল পয়েন্ট করেছেন। সত্যি কথা বলতে, আমি এই উত্তরটি এত জনপ্রিয় হয়ে উঠতে পারি নি। উত্তরগুলি এখন "প্রাপ্য" করার জন্য উত্তরটি প্রসারিত করেছি। আশা করি এটির উন্নতি হবে।
স্টুয়ার্ট 11


14

স্ট্রিং.জেটবাইটস () ব্যবহার করে দেখুন। এটি স্ট্রিং ডেটা উপস্থাপন করে একটি বাইট [] প্রদান করে। উদাহরণ:

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

14

কেবল:

String abc="abcdefghight";

byte[] b = abc.getBytes();

যদি abcইউএস-এএসসিআইআই অক্ষর, যেমন "greater than 2³² − 1"বা কেবল বাইনারি ডেটা ("" A2b2 "এর মতো) থাকে তবে কী হবে?
মার্কিন উইন্ডল

এটি অক্ষরের জন্য কাজ করে না এই স্ট্রিংটিতে কেবলমাত্র 5 টি অক্ষর রয়েছে। তবে আমি যখন ব্যবহার getBytes()করি তখন আমি 7 টি অক্ষর পেয়েছি।
তেওকি



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