জাভা পূর্ণসংখ্যা বাইট অ্যারে


190

আমি একটি পূর্ণসংখ্যা পেয়েছি: 1695609641

যখন আমি পদ্ধতিটি ব্যবহার করি:

String hex = Integer.toHexString(1695609641);
system.out.println(hex); 

দেয়:

6510f329

তবে আমি একটি বাইট অ্যারে চাই:

byte[] bytearray = new byte[] { (byte) 0x65, (byte)0x10, (byte)0xf3, (byte)0x29};

আমি কীভাবে এটি তৈরি করতে পারি?



উত্তর:


293

জাভা এনআইওর বাইটবফার ব্যবহার করা খুব সহজ:

byte[] bytes = ByteBuffer.allocate(4).putInt(1695609641).array();

for (byte b : bytes) {
   System.out.format("0x%x ", b);
}

আউটপুট:

0x65 0x10 0xf3 0x29 

4
বা বিন্যাস ব্যবহার "0x%02X"করে আপনি সবসময় দুই হেক্সাডেসিমেল অক্ষর সেইসাথে বড় হাতের hexadecimals, যেমন চান System.out.format("0x%02X", (byte) 10)প্রদর্শন 0x0A
মার্টেন বোদেউয়েস

12
4 এর হার্ডকোডিং এড়ানোর জন্য আপনি পূর্ণসংখ্যা.SIZE / 8 ব্যবহার করতে পারেন, এটি এমন একটি প্যাটার্ন যা লংয়ের মতো অন্যান্য ধরণের জন্য ভাল কাজ করে।
davenpcj

3
@ ডেভেনপিসিজে আপনি এমনকি পূর্ণসংখ্যার ব্যবহার করতে পারেন S সাইজ / বাইট.সিজাব
rkosegi

11
জাভা 8 এর পর থেকে @ আরকোসেগি বা এমনকি পূর্ণসংখ্যা
বিভাটিস

1
@MaartenBodewes থ্রেড প্রোফাইল ফর্ম্যাটিং কিন্তু নেটিভ টাইপ অপারেশন সম্পর্ক নেই
তারিখে Jacek Cz

146

কেমন:

public static final byte[] intToByteArray(int value) {
    return new byte[] {
            (byte)(value >>> 24),
            (byte)(value >>> 16),
            (byte)(value >>> 8),
            (byte)value};
}

ধারণাটি হ'ল আমার নয় । আমি এটি ডিজন ডটকমের কোনও পোস্ট থেকে নিয়েছি


44
আমি আপনার বক্তব্যটি দেখতে পাচ্ছি, তবে এই নির্দিষ্ট কাজের জন্য 'আমার' কোডটি কিছু 'ম্যাজিক' বাইটবফারের চেয়ে বেশি ঘোষিত এবং স্পষ্ট, কোনটি এটি করে কিনা তা পরীক্ষা করতে হবে।
গ্রেজগোর্জ ওলেডজকি

24
@ কেভিন - এটি অত্যন্ত কঠোর - এমন অনেকগুলি মামলা রয়েছে যেখানে এই ধরণের কোড উপযুক্ত, যেমন চিত্র প্রক্রিয়াকরণে। জেডি কে লাইব্রেরিগুলি সাধারণভাবে দুর্দান্ত তবে তারা কভার করে না এবং / অথবা সমস্ত ব্যবহারের ক্ষেত্রে অনুকূলিত হয় না।
মাইক্রা

14
একমত; কিছু সাধারণ এবং সুপরিচিত বাইট অপারেশনের তুলনায় বাইটবফারের ওভারহেড এবং জটিলতা উপযুক্ত নাও হতে পারে।
সুইডুনলপ

6
আরেকটি বিষয় যা আমি যোগ করব তা হ'ল আপনি ডান শিফট অপারেটরের >>>পরিবর্তে স্বাক্ষরবিহীন ডান শিফট অপারেটরটি ব্যবহার করেছেন >>( ডকস.অরাকলস / জাভাসে / টিউটোরিয়াল / জাভা / নটস্যান্ডবোল্টস / ওপি 3 এইচটিএমএল ) সুতরাং আচরণটি পছন্দসই / স্বাক্ষরিত বনাম স্বাক্ষরযুক্ত সংখ্যার সাথে প্রত্যাশিত হিসাবে
রবিভি 7'12

4
উল্লিখিত বাইট বাফার বা বিগইন্টেজার পদ্ধতির চেয়ে এই পদ্ধতিকে খুব দ্রুত বাচ্চা বলে মনে হচ্ছে। আপনি যদি অনেকগুলি রূপান্তর করছেন তবে অ্যাকাউন্টে নেওয়ার মতো আরও কিছু।
সন্ধানকারী

45

BigInteger.valueOf(1695609641).toByteArray()


2
আপনার কী গ্যারান্টি রয়েছে যে এটি একটি 4 বাইট অ্যারে উত্পাদন করবে?
MeBigFatGuy

2
মেবিগফ্যাটগুয়ে ঠিক কী লিখেছেন। জাভাদোক BigInteger.toByteArray()বলেছেন: "অ্যারেতে এই বিগইন্টিগের প্রতিনিধিত্ব করতে প্রয়োজনীয় ন্যূনতম সংখ্যক বাইট থাকবে ..."
আইজজা

2
যেখানে প্রশ্নটিতে এটি বাইট অ্যারে স্থির দৈর্ঘ্য 4 হতে জিজ্ঞাসা করে? অ্যালগরিদমের উপর নির্ভর করে এর অংশটি বোঝানো হচ্ছে আপনি অ্যারের দৈর্ঘ্যটি ব্যবহার করতে পারবেন
vmpn

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

2
এটি 0x7f এর জন্য একটি বাইট এবং 0x80 এর জন্য দুটি বাইট (দুটি বাইট হচ্ছে: 0x0 0x80) তৈরি করে বলে মনে হচ্ছে।
স্কট

26
byte[] IntToByteArray( int data ) {    
    byte[] result = new byte[4];
    result[0] = (byte) ((data & 0xFF000000) >> 24);
    result[1] = (byte) ((data & 0x00FF0000) >> 16);
    result[2] = (byte) ((data & 0x0000FF00) >> 8);
    result[3] = (byte) ((data & 0x000000FF) >> 0);
    return result;        
}


7
byte[] conv = new byte[4];
conv[3] = (byte) input & 0xff;
input >>= 8;
conv[2] = (byte) input & 0xff;
input >>= 8;
conv[1] = (byte) input & 0xff;
input >>= 8;
conv[0] = (byte) input;

2
এটি সর্বনিম্ন উল্লেখযোগ্য 8 বাইট নিষ্কাশন করে। এটি রূপান্তরিত অক্টেটে ইনপুট নম্বরটির সাইন টেনে এড়াতেও এড়াতে পারে।
কার্ল স্মট্রিক্জ

stackoverflow.com/questions/35305634/… - আপনি কি এই সিটিকে # জাভাতে সমাধান করতে পারেন?

5
public static byte[] intToBytes(int x) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(bos);
    out.writeInt(x);
    out.close();
    byte[] int_bytes = bos.toByteArray();
    bos.close();
    return int_bytes;
}

4

নীচের অংশগুলি কমপক্ষে ইউডিপিতে কোনও প্রেরণ পাঠানোর জন্য কাজ করে।

ইনট টু বাইট অ্যারে:

public byte[] intToBytes(int my_int) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = new ObjectOutputStream(bos);
    out.writeInt(my_int);
    out.close();
    byte[] int_bytes = bos.toByteArray();
    bos.close();
    return int_bytes;
}

বাইট অ্যারে ইন ইন:

public int bytesToInt(byte[] int_bytes) throws IOException {
    ByteArrayInputStream bis = new ByteArrayInputStream(int_bytes);
    ObjectInputStream ois = new ObjectInputStream(bis);
    int my_int = ois.readInt();
    ois.close();
    return my_int;
}

4
অবজেক্টআউটপুট স্ট্রিমের ব্যবহার ভুল। ডেটাআউটপুট স্ট্রিম ব্যবহার করুন, ওওএসের ব্যবহার এটি তৈরি করে যাতে বাইট অ্যারে 4 বাইট না হয়।
MeBigFatGuy

2

যেহেতু সাধারণত আপনি এই অ্যারেটিকে কোনও পরবর্তী বিন্দুতে আবার কোনও int এ রূপান্তর করতে চান, তাই এখানে ints এর অ্যারেগুলিকে বাইটস এবং এর বিপরীতে একটি অ্যারে রূপান্তর করার পদ্ধতিগুলি এখানে রয়েছে:

public static byte[] convertToByteArray(final int[] pIntArray)
{
    final byte[] array = new byte[pIntArray.length * 4];
    for (int j = 0; j < pIntArray.length; j++)
    {
        final int c = pIntArray[j];
        array[j * 4] = (byte)((c & 0xFF000000) >> 24);
        array[j * 4 + 1] = (byte)((c & 0xFF0000) >> 16);
        array[j * 4 + 2] = (byte)((c & 0xFF00) >> 8);
        array[j * 4 + 3] = (byte)(c & 0xFF);
    }
    return array;
}

public static int[] convertToIntArray(final byte[] pByteArray)
{
    final int[] array = new int[pByteArray.length / 4];
    for (int i = 0; i < array.length; i++)
        array[i] = (((int)(pByteArray[i * 4]) << 24) & 0xFF000000) |
                (((int)(pByteArray[i * 4 + 1]) << 16) & 0xFF0000) |
                (((int)(pByteArray[i * 4 + 2]) << 8) & 0xFF00) |
                ((int)(pByteArray[i * 4 + 3]) & 0xFF);
    return array;
}

মনে রাখবেন যে সাইন প্রচার এবং এর কারণে, "ইনট্রে ফিরে রূপান্তর করার সময়" & 0xFF ... "প্রয়োজন।


1
integer & 0xFF

প্রথম বাইট জন্য

(integer >> 8) & 0xFF

দ্বিতীয় এবং লুপ ইত্যাদির জন্য, পূর্বনির্ধারিত বাইট অ্যারেতে লেখা। দুর্ভাগ্যক্রমে কিছুটা অগোছালো।


1

Org.apache.hadoop.hbase.util.ytil.Bytes শ্রেণীর হাতে খুব সহজেই বাইট [] রূপান্তর পদ্ধতি রয়েছে, তবে আপনি কেবল এই উদ্দেশ্যে আপনার প্রকল্পে পুরো এইচবেস জারটি যুক্ত করতে চাইবেন না। অবাক করা বিষয় যে এই জাতীয় পদ্ধতিটি কেবল জেডিকে থেকে আফাইককে হারিয়েছে না, তবে কমোন আইওয়ের মতো স্পষ্ট লিবস থেকেও অনুপস্থিত।


1

আমার চেষ্টা:

public static byte[] toBytes(final int intVal, final int... intArray) {
    if (intArray == null || (intArray.length == 0)) {
        return ByteBuffer.allocate(4).putInt(intVal).array();
    } else {
        final ByteBuffer bb = ByteBuffer.allocate(4 + (intArray.length * 4)).putInt(intVal);
        for (final int val : intArray) {
            bb.putInt(val);
        }
        return bb.array();
    }
}

এটির সাহায্যে আপনি এটি করতে পারেন:

byte[] fourBytes = toBytes(0x01020304);
byte[] eightBytes = toBytes(0x01020304, 0x05060708);

পূর্ণাঙ্গ শ্রেণি এখানে: https://gist.github.com/superbob/6548493 , এটি শর্টস বা দীর্ঘ থেকে আরম্ভকরণ সমর্থন করে

byte[] eightBytesAgain = toBytes(0x0102030405060708L);

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