বাইট অ্যারে (জাভা) এ পূর্ণসংখ্যা রূপান্তর করুন


137

কি ফাস্ট একটি রূপান্তর করতে উপায় Integerএকটি মধ্যে Byte Array?

যেমন 0xAABBCCDD => {AA, BB, CC, DD}


1
ফলস্বরূপ বাইট অ্যারেটি কি ফর্ম্যাট তা বিবেচনা করে? আপনি এটি দিয়ে কি করবেন?
স্কাফম্যান

উত্তর:


237

কটাক্ষপাত আছে ByteBuffer বর্গ।

ByteBuffer b = ByteBuffer.allocate(4);
//b.order(ByteOrder.BIG_ENDIAN); // optional, the initial order of a byte buffer is always BIG_ENDIAN.
b.putInt(0xAABBCCDD);

byte[] result = b.array();

বাইট অর্ডার নিশ্চিত সেট যে result[0] == 0xAA, result[1] == 0xBB, result[2] == 0xCCএবং result[3] == 0xDD

অথবা বিকল্পভাবে, আপনি নিজেই এটি করতে পারেন:

byte[] toBytes(int i)
{
  byte[] result = new byte[4];

  result[0] = (byte) (i >> 24);
  result[1] = (byte) (i >> 16);
  result[2] = (byte) (i >> 8);
  result[3] = (byte) (i /*>> 0*/);

  return result;
}

ByteBufferবর্গ যদিও মলিন হাত কাজের জন্য পরিকল্পনা করা হয়েছিল। বাস্তবে ব্যক্তিগত java.nio.Bitsসাহায্যকারী পদ্ধতিগুলি যা দ্বারা ব্যবহৃত হয় তা সংজ্ঞায়িত করে ByteBuffer.putInt():

private static byte int3(int x) { return (byte)(x >> 24); }
private static byte int2(int x) { return (byte)(x >> 16); }
private static byte int1(int x) { return (byte)(x >>  8); }
private static byte int0(int x) { return (byte)(x >>  0); }

3
বাইটবফার ইতিমধ্যে সেখানে উপস্থিত থাকলে এটি ভালভাবে কাজ করবে ... অন্যথায় মনে হচ্ছে বরাদ্দটি করতে আরও বেশি সময় লাগবে, কেবলমাত্র দৈর্ঘ্যের 4 বাইট অ্যারে বরাদ্দ করা এবং ম্যানুয়ালি শিফটিংয়ের চেয়ে ... তবে আমরা সম্ভবত কথা বলছি ছোট পার্থক্য সম্পর্কে।
জেসন এস

বাইটবফার উদাহরণটি ক্যাশে করা যেতে পারে; এবং অভ্যন্তরীণভাবে এটি অবশ্যই যাইহোক স্থানান্তর এবং মাস্কিং দিয়ে প্রয়োগ করা হয়েছে।
গ্রেগরি পাকোস্

4
এটি একটি পুরোপুরি সূক্ষ্ম উত্তর। নোট করুন যে বিগ-এন্ডিয়ান হ'ল নির্দিষ্ট ডিফল্ট, এবং পদ্ধতিগুলি "চেইনযোগ্য", এবং অবস্থান যুক্তিটি optionচ্ছিক, তাই এটি সমস্ত হ্রাস করে: বাইট [] ফলাফল = বাইটবফার.অলোকট (4) .পুটআইন্ট (0xAABBCCDD) .আরে ( ); অবশ্যই, আপনি যদি বার বার এটি করে থাকেন এবং সমস্ত ফলাফল একসাথে (যদি আপনি এই ধরণের জিনিসটি করছেন তখন সাধারণ) একত্র করে থাকেন, তবে একটি বার্তা বরাদ্দ করুন এবং বার বার ফটফু () আপনার প্রয়োজনীয় সমস্ত জিনিস এতে বরাদ্দ করুন - এটি আপনার যেতে যেতে অফসেটের উপর নজর রাখবে। এটি সত্যিই একটি দুর্দান্ত উপকারী শ্রেণি।
কেভিন Bourrillion

এটি স্বাক্ষরিত প্রকারগুলি কী নিয়ে আসে?
গ্রেগরি পাকোসজ

3
কারণ কে জানে না। ইনপুট পূর্ণসংখ্যার আকার যাই হোক না কেন পুটইন্ট সর্বদা 4 বাইট লিখবে। আপনি যদি কেবল 2 বাইট চান, পুটশোর্ট ইত্যাদি ব্যবহার করুন ...
বিভিডিবি

36

ব্যবহার BigInteger:

private byte[] bigIntToByteArray( final int i ) {
    BigInteger bigInt = BigInteger.valueOf(i);      
    return bigInt.toByteArray();
}

ব্যবহার DataOutputStream:

private byte[] intToByteArray ( final int i ) throws IOException {      
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(bos);
    dos.writeInt(i);
    dos.flush();
    return bos.toByteArray();
}

ব্যবহার ByteBuffer:

public byte[] intToBytes( final int i ) {
    ByteBuffer bb = ByteBuffer.allocate(4); 
    bb.putInt(i); 
    return bb.array();
}

5
যদিও বাইট ক্রমের দিকে মনোযোগ দিন
গ্রেগরি পাকোসেজ

1
বাইটবফার কি একটি স্বাক্ষরবিহীন ইনট দেয়?
অরুণ জর্জ

@ প্যাসাল বাইটবফার ব্যবহার করে আমি বাইটবফার বিবি = বাইটবফার.লোকট (3) দিয়ে চেষ্টা করেছি; এর জন্য এটি java.nio.BufferOverflowException দিচ্ছে, আমি কেন পাচ্ছি না কেন এটি 4 এর চেয়ে কম মানের জন্য কাজ করছে না? আপনি দয়া করে ব্যাখ্যা করতে পারেন?
সঞ্জয় জৈন

@ সঞ্জয়জাইন আপনি একটি বাফার ওভারফ্লো ব্যতিক্রম পেয়েছেন কারণ জাভাতে ইনটগুলি 32-বিট বা 4 বাইট আকারের এবং তাই আপনাকে আপনার বাইটবফারে কমপক্ষে 4 বাইট মেমরি বরাদ্দ করতে হবে।
নাড়া দিয়ে

@ গ্রেগরিপাকোস্ বাইট অর্ডার সম্পর্কে সঠিক। ByteBufferযদি আপনি 2 ^ 31 - 1 এর চেয়ে বেশি
ইন্ট্রি

31

এই ফাংশনটি ব্যবহার করুন এটি আমার জন্য কাজ করে

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

এটি একটি বাইট মান মধ্যে ইন্ট অনুবাদ


অন্যান্য উত্তরের তুলনায় সর্বাধিক উল্লেখযোগ্য বিট এবং আরও দক্ষ নির্বিশেষে এটি কার্যকরভাবে কাজ করবে না worth এছাড়াও '>>' ব্যবহার করতে পারে।
অ্যালগোলিস

1
এর মতো সরাসরি সমাধান অবশ্যই কোনও গ্রন্থাগার পদ্ধতি কল করার চেয়ে দ্রুত is কখনও কখনও আপনাকে লাইব্রেরি পদ্ধতি কলগুলির সমস্ত অতিরিক্ত ওভারহেড ব্যয় না করে সরাসরি কয়েকটি লাইন কোডের সাথে বিটগুলি দিয়ে ফিড করতে হবে।
ডেভিড আর ট্রিবিলে

এবং এটি ভাষাগুলির মধ্যে ভাল রূপান্তরিত করে বহু ভাষা সফ্টওয়্যার বিকাশের জন্য ভাল।
সমন্বয়কারী

15

আপনি যদি পেয়ারা পছন্দ করেন তবে আপনি এটির Intsক্লাস ব্যবহার করতে পারেন :


জন্য intbyte[], ব্যবহার toByteArray():

byte[] byteArray = Ints.toByteArray(0xAABBCCDD);

ফলাফল হয় {0xAA, 0xBB, 0xCC, 0xDD}


তার বিপরীত হয় fromByteArray()বা fromBytes():

int intValue = Ints.fromByteArray(new byte[]{(byte) 0xAA, (byte) 0xBB, (byte) 0xCC, (byte) 0xDD});
int intValue = Ints.fromBytes((byte) 0xAA, (byte) 0xBB, (byte) 0xCC, (byte) 0xDD);

ফলাফল হয় 0xAABBCCDD


8

আপনি ব্যবহার করতে পারেন BigInteger:

পূর্ণসংখ্যা থেকে:

byte[] array = BigInteger.valueOf(0xAABBCCDD).toByteArray();
System.out.println(Arrays.toString(array))
// --> {-86, -69, -52, -35 }

প্রত্যাবর্তিত অ্যারেটি এমন আকারের হয় যা সংখ্যার প্রতিনিধিত্ব করতে প্রয়োজনীয় হয়, সুতরাং এটি উদাহরণস্বরূপ 1 টি উপস্থাপন করার জন্য এটি আকারের 1 হতে পারে। যাইহোক, কোনও int পাস করা হলে আকারটি চার বাইটের বেশি হতে পারে না।

স্ট্রিংগুলি থেকে:

BigInteger v = new BigInteger("AABBCCDD", 16);
byte[] array = v.toByteArray();

তবে আপনাকে প্রথম 0x7Fনজরদারিটি দেখতে হবে, যদি প্রথম বাইটটি উচ্চতর হয় (যেমন এই ক্ষেত্রে রয়েছে), যেখানে বিগইন্টিজার অ্যারের শুরুতে 0x00 বাইট প্রবেশ করিয়ে দেবে। ইতিবাচক এবং নেতিবাচক মানগুলির মধ্যে পার্থক্য করার জন্য এটি প্রয়োজন।


ধন্যবাদ! তবে এটি যেহেতু বিগইন্টিজার, তাই কি চার্জগুলি সঠিকভাবে মোড়ানো হবে? এটি পূর্ণসংখ্যা যা পূর্ণসংখ্যার বাইরে থাকে MA MAX_VALUE তবে এখনও কেবল 4 বাইট দিয়ে প্রতিনিধিত্ব করা যায়?
বাটারক্যাপ

1
এটি অবশ্যই কার্যকর করার জন্য দ্রুত নয়। ;)
পিটার লরে

এটি একটি ভাল বিকল্প নয়। এটি কেবল 0x00 বাইট যোগ করতে পারে তা নয়, এটি নেতৃস্থানীয় শূন্যগুলিও ছিনিয়ে নিতে পারে।
জেডজেড কোডার

1

সহজ সমাধান যা বাইটআর্ডারকে সঠিকভাবে পরিচালনা করে:

ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()).putInt(yourInt).array();



1

এটি আপনাকে সাহায্য করবে।

import java.nio.ByteBuffer;
import java.util.Arrays;

public class MyClass
{
    public static void main(String args[]) {
        byte [] hbhbytes = ByteBuffer.allocate(4).putInt(16666666).array();

        System.out.println(Arrays.toString(hbhbytes));
    }
}

0

শিফটও করতে পারে -

byte[] ba = new byte[4];
int val = Integer.MAX_VALUE;

for(byte i=0;i<4;i++)
    ba[i] = (byte)(val >> i*8);
    //ba[3-i] = (byte)(val >> i*8); //Big-endian

0

এখানে একটি পদ্ধতি যা ঠিক কাজটি করা উচিত।

public byte[] toByteArray(int value)
{
    final byte[] destination = new byte[Integer.BYTES];
    for(int index = Integer.BYTES - 1; index >= 0; index--)
    {
        destination[i] = (byte) value;
        value = value >> 8;
    };
    return destination;
};

0

এটি আমার সমাধান:

public void getBytes(int val) {
    byte[] bytes = new byte[Integer.BYTES];
    for (int i = 0;i < bytes.length; i ++) {
        int j = val % Byte.MAX_VALUE;
        bytes[i] = (j == 0 ? Byte.MAX_VALUE : j);
    }
}

এছাড়াও Stringy পদ্ধতি:

public void getBytes(int val) {
    String hex = Integer.toHexString(val);
    byte[] val = new byte[hex.length()/2]; // because byte is 2 hex chars
    for (int i = 0; i < hex.length(); i+=2)
        val[i] = Byte.parseByte("0x" + hex.substring(i, i+2), 16);
    return val;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.