আমি জাভাতে কীভাবে বাইট অ্যারে শুরু করব?


138

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

private static final byte[] CDRIVES = new byte[] { (byte)0xe0, 0x4f, (byte)0xd0,
    0x20, (byte)0xea, 0x3a, 0x69, 0x10, (byte)0xa2, (byte)0xd8, 0x08, 0x00, 0x2b,
    0x30, 0x30, (byte)0x9d };
private static final byte[] CMYDOCS = new byte[] { (byte)0xba, (byte)0x8a, 0x0d,
    0x45, 0x25, (byte)0xad, (byte)0xd0, 0x11, (byte)0x98, (byte)0xa8, 0x08, 0x00,
    0x36, 0x1b, 0x11, 0x03 };
private static final byte[] IEFRAME = new byte[] { (byte)0x80, 0x53, 0x1c,
    (byte)0x87, (byte)0xa0, 0x42, 0x69, 0x10, (byte)0xa2, (byte)0xea, 0x08,
    0x00, 0x2b, 0x30, 0x30, (byte)0x9d };
...
and so on

আমি এমন কিছু ব্যবহার করতে পারি যা কম দক্ষ হতে পারে, তবে আরও পরিষ্কার দেখাচ্ছে? উদাহরণ স্বরূপ:

private static final byte[] CDRIVES =
    new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" };

উত্তর:


111

একটি ফাংশন ব্যবহার করে একটি হেক্সা স্ট্রিংকে রূপান্তর করে byte[]আপনি করতে পারেন

byte[] CDRIVES = hexStringToByteArray("e04fd020ea3a6910a2d808002b30309d");

আমি আপনাকে জাভা ব্যবহার করে বেট অ্যারেতে হেক্স ডাম্পের একটি স্ট্রিং উপস্থাপনার রূপান্তরিত ডেভ এল দ্বারা সংজ্ঞায়িত ফাংশনটি ব্যবহার করার পরামর্শ দেব ?

আমি সর্বাধিক পঠনযোগ্যতার জন্য এটি এখানে sertোকান:

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

আপনি যদি সিডিআরআইভিএস দেয় staticএবং final, পারফরম্যান্স ড্রপটি অপ্রাসঙ্গিক।


78
byte[] myvar = "Any String you want".getBytes();

যে কোনও চরিত্র সরবরাহ করতে স্ট্রিং লিটারালগুলি পালানো যেতে পারে:

byte[] CDRIVES = "\u00e0\u004f\u00d0\u0020\u00ea\u003a\u0069\u0010\u00a2\u00d8\u0008\u0000\u002b\u0030\u0030\u009d".getBytes();

50
পোস্টার দ্বারা পছন্দসইভাবে (বাইনারি) পরিবর্তে স্ট্রিংটি (ASCII) "0000"তে পরিণত হয় না ? {0x30,0x30,0x30,0x30}{0x00,0x00,0x00,0x00}
jw

5
প্রশ্নের শিরোনাম দেখুন। তারপরে এই উত্তরটি ফিরে দেখুন। এখন বলুন, এতে কী দোষ আছে? এটি পোস্টারের নির্দিষ্ট সমস্যাটিকে সমাধান নাও করতে পারে তবে এটি নিশ্চিতভাবেই আমার সমাধান হয়েছে। সিউডোরান্ডম সংখ্যা জেনারেটরের বীজ হিসাবে ব্যবহার করতে আমার একটি স্ট্রিংকে বাইট অ্যারে রূপান্তরিত করতে হবে এবং এটি একটি কবজির মতো কাজ করেছে।

@ e18r এটি বাইট তৈরি করছে, হ্যাঁ, তবে আপনি জানেন না যে ডিফল্ট চরসেটে এই অবনতি থেকে। কমপক্ষে .getBytes (কাঙ্ক্ষিত এনকোডিং) ব্যবহার করুন।
কোয়ান্ট

@ পেটমিজ বোবা প্রশ্ন: জাভাতে, ""। বেটবাইটস (ইউটিএফ_8)) এর মতো কিছু; (একটি খালি স্ট্রিং উপর getBytes) একটি নিরাপদ জিনিস? এটা কি 'আইনী'? বা আমি কেবল এটি করতে পারি: = নতুন বাইট [0]; ?
রবার্ট আছমান

1
@ রবার্টআচম্যান "" .গেটবাইটস ("ইউটিএফ -8") একটি খালি অ্যারে ফিরিয়ে দেবে এবং এটি পুরোপুরি আইনী।
জাজেপি

33

জাভা 6-তে একটি পদ্ধতি রয়েছে যা আপনি যা চান ঠিক তেমন করে:

private static final byte[] CDRIVES = javax.xml.bind.DatatypeConverter.parseHexBinary("e04fd020ea3a6910a2d808002b30309d")

বিকল্পভাবে আপনি গুগল পেয়ারা ব্যবহার করতে পারেন :

import com.google.common.io.BaseEncoding;
private static final byte[] CDRIVES = BaseEncoding.base16().lowerCase().decode("E04FD020ea3a6910a2d808002b30309d".toLowerCase());

আপনি যখন ছোট অ্যারে ব্যবহার করেন তখন পেয়ারা পদ্ধতিটি ওভারকিল হয়। তবে পেয়ারাতে এমন সংস্করণও রয়েছে যা ইনপুট স্ট্রিমগুলি পার্স করতে পারে। বড় হেক্সাডেসিমাল ইনপুটগুলির সাথে কাজ করার সময় এটি একটি দুর্দান্ত বৈশিষ্ট্য।


লিখিতভাবে পেয়ারা উদাহরণটি বেশ কার্যকরভাবে কাজ করে না - base16().lowerCase().decode(...)আপনার যদি ছোট কেস হেক্সস সংখ্যা থাকে তা হওয়া দরকার। docs.guava-libraries.googlecode.com/git/javadoc/com/google/…
পিটার

@ পিটারডিগলপার ভাল অনুসন্ধান, আমি উত্তরটি আপডেট করেছি যাতে কোডটি এখন নিম্ন এবং উপরের উভয় অক্ষরের সাথে স্ট্রিং পরিচালনা করে।
stefan.schwetschke

1
javax.xml.bindজাভা 9 এ দুঃখজনকভাবে সরানো হয়েছে
এলোমেলোভাবে 999

7

আপনি এই মানগুলি বাইট অ্যারের পরিবর্তে সঞ্চয় করতে জাভা ইউআইডি ক্লাস ব্যবহার করতে পারেন:

UUID

public UUID(long mostSigBits,
            long leastSigBits)

নির্দিষ্ট ডেটা ব্যবহার করে একটি নতুন ইউআইডি তৈরি করে। MostSigBits ইউআইডি-র সবচেয়ে উল্লেখযোগ্য 64 বিটগুলির জন্য ব্যবহৃত হয় এবং সর্বনিম্ন সিগবিটগুলি ইউআইডি-র সর্বনিম্ন উল্লেখযোগ্য 64 বিট হয়ে যায়।


2

যতক্ষণ না একটি পরিষ্কার প্রক্রিয়া সম্পর্কিত, আপনি বাইটআর্যআউটপুট স্ট্রিম অবজেক্টটি ব্যবহার করতে পারেন ...

ByteArrayOutputStream bObj = new ByteArrayOutputStream();
bObj.reset();

// সমস্ত মান এক সাথে ব্যবহার করে bObj লিখুন

bObj.write(byte value)

// হয়ে গেলে আপনি বাইট [] ব্যবহার করতে পারেন

CDRIVES = bObj.toByteArray();

// আপনি সিএমওয়াইডোকস এবং আইএফআরএমে একই ধরণের প্রক্রিয়া পুনরাবৃত্তি করতে পারেন তার চেয়েও,

দ্রষ্টব্য যদি আপনার কাছে সত্যিই ছোট অ্যারে থাকে তবে এটি কোনও কার্যকর সমাধান নয়।


2

কোনও গ্রন্থাগারবিহীন একটি সমাধান, গতিশীল দৈর্ঘ্য ফেরত, স্বাক্ষরযুক্ত পূর্ণসংখ্যা ব্যাখ্যা (দু'জনের পরিপূরক নয়)

    public static byte[] numToBytes(int num){
    if(num == 0){
        return new byte[]{};
    }else if(num < 256){
        return new byte[]{ (byte)(num) };
    }else if(num < 65536){
        return new byte[]{ (byte)(num >>> 8),(byte)num };
    }else if(num < 16777216){
        return new byte[]{ (byte)(num >>> 16),(byte)(num >>> 8),(byte)num };
    }else{ // up to 2,147,483,647
        return new byte[]{ (byte)(num >>> 24),(byte)(num >>> 16),(byte)(num >>> 8),(byte)num };
    }
}

1

এই পরিস্থিতিতে আমার পছন্দসই বিকল্পটি হ'ল y হেক্স এবং বাইনারি org.apache.commons.codec.binary.Hexমধ্যে রূপান্তর করার জন্য দরকারী এপিআই রয়েছে use Stringউদাহরণ স্বরূপ:

  1. Hex.decodeHex(char[] data)DecoderExceptionঅ্যারেতে যদি অ-হেক্স অক্ষর থাকে বা একটি বিজোড় সংখ্যক অক্ষর থাকে তবে এটি ছুড়ে ফেলে ।

  2. Hex.encodeHex(byte[] data)উপরের ডিকোড পদ্ধতির সমকক্ষ, এবং থুতু আউট char[]

  3. Hex.encodeHexString(byte[] data)যা byteঅ্যারে থেকে ফিরে a এ রূপান্তর করে String

ব্যবহার: Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())


1

আপনি এই ইউটিলিটি ফাংশনটি ব্যবহার করতে পারেন:

public static byte[] fromHexString(String src) {
    byte[] biBytes = new BigInteger("10" + src.replaceAll("\\s", ""), 16).toByteArray();
    return Arrays.copyOfRange(biBytes, 1, biBytes.length);
}

ডেনিস সাগুরেট এবং স্টেফান.সেকওয়েটস্কের বৈকল্পিকগুলির বিপরীতে, এটি ইনপুট স্ট্রিংয়ে বিভাজক চিহ্নগুলি (স্পেস, ট্যাব, ইত্যাদি) সন্নিবেশ করায় এটি আরও পাঠযোগ্য read

ব্যবহারের উদাহরণ:

private static final byte[] CDRIVES
    = fromHexString("e0 4f d0 20 ea 3a 69 10 a2 d8 08 00 2b 30 30 9d");
private static final byte[] CMYDOCS
    = fromHexString("BA8A0D4525ADD01198A80800361B1103");
private static final byte[] IEFRAME
    = fromHexString("80531c87 a0426910 a2ea0800 2b30309d");

1

ক্ষুদ্রতম অভ্যন্তরীণ প্রকার, যা সংকলনের সময় হেক্স সংখ্যা দ্বারা নির্ধারিত হতে পারে , যেমন হিসাবে গৃহীত হয়

private static final char[] CDRIVES_char = new char[] {0xe0, 0xf4, ...};

সমতুল্য বাইট অ্যারের জন্য কোনও রূপান্তর স্থাপন করতে পারে

public static byte[] charToByteArray(char[] x)
{
    final byte[] res = new byte[x.length];
    for (int i = 0; i < x.length; i++)
    {
        res[i] = (byte) x[i];
    }
    return res;
}

public static byte[][] charToByteArray(char[][] x)
{
    final byte[][] res = new byte[x.length][];
    for (int i = 0; i < x.length; i++)
    {
        res[i] = charToByteArray(x[i]);
    }
    return res;
}

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