जावा पूर्णांक बाइट सरणी के लिए


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

जावा NIO के बाइटबफ़र का उपयोग करना बहुत सरल है:

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"यदि आप हमेशा दो हेक्साडेसिमल अक्षर और साथ ही अपरकेस हेक्साडेसिमल जैसे उदाहरण System.out.format("0x%02X", (byte) 10)प्रदर्शित करते हैं 0x0A
मार्टन बोदवेस

12
4 को हार्डकोड करने से बचने के लिए आप Integer.SIZE / 8 का उपयोग कर सकते हैं, जो एक ऐसा पैटर्न है जो लॉन्ग जैसे अन्य प्रकारों के लिए अच्छा काम करता है।
davenpcj

3
@davenpcj आप यहां तक ​​कि Integer.SIZE / Byte.SIZE
rkosegi

11
@rkosegi या यहां तक ​​कि Integer.BYTES जावा 8 के बाद :)
drvdijk

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};
}

विचार मेरा नहीं है । मैंने इसे dzone.com पर कुछ पोस्ट से लिया है


44
मैं आपकी बात देखता हूं, लेकिन इस विशेष कार्य के लिए 'मेरा' कोड कुछ 'मैजिक' बाइटफायर की तुलना में अधिक घोषणात्मक और स्पष्ट है, जिसे देखने के लिए व्यक्ति को यह देखना पड़ता है कि यह क्या करता है।
ग्रेजेगर्ज़ ओलेदज़की

24
@ केविन - यह बहुत कठोर है - ऐसे बहुत सारे मामले हैं जहां इस तरह का कोड उपयुक्त है, जैसे छवि प्रसंस्करण में। JDK लाइब्रेरी सामान्य रूप से महान हैं, लेकिन वे सभी उपयोग के मामलों के लिए कवर और / या अनुकूलित नहीं हैं।
मिकेरा

14
माना; बाइटबफ़र की ओवरहेड और जटिलता कुछ सरल और प्रसिद्ध बाइट संचालन की तुलना में उपयुक्त नहीं हो सकती है।
swdunlop

6
एक और बिंदु मैं जोड़ूंगा कि आपने सही शिफ्ट ऑपरेटर के >>>बजाय अहस्ताक्षरित सही शिफ्ट ऑपरेटर का उपयोग किया है >>( docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html ) इसलिए व्यवहार वांछित नहीं हो सकता है / जैसा कि हस्ताक्षरित बनाम अहस्ताक्षरित संख्या के साथ अपेक्षित है
रॉब

4
यह दृष्टिकोण बाइटबफ़र या बिगइन्तेर्जर विधियों की तुलना में अधिक तेज है। यदि आप बहुत सारे रूपांतरण कर रहे हैं तो कुछ और बात ध्यान में रखें।
साधक

45

BigInteger.valueOf(1695609641).toByteArray()


2
आपको क्या गारंटी है कि वह 4 बाइट सरणी का उत्पादन करेगा?
MeBigFatGuy

2
वास्तव में MeBigFatGuy ने क्या लिखा है। BigInteger.toByteArray()राज्यों के Javadoc : "सरणी में इस BigInteger का प्रतिनिधित्व करने के लिए आवश्यक बाइट्स की न्यूनतम संख्या होगी ..."
icza

2
जहाँ प्रश्न में यह बाइट सरणी के लिए निश्चित लंबाई 4 के लिए पूछता है? एल्गोरिथ्म के आधार पर इसका मतलब यह है कि आप सरणी की लंबाई का उपयोग कर सकते हैं
vmpn

यह बहुत अधिक गतिशील है और सही उत्तर होना चाहिए। यदि आप चाहें, तो आप केवल वांछित आकार बनाने के लिए एक ऐरे एपेंड कर सकते हैं। विशेष रूप से जब आपको जावा पर हस्ताक्षर किए गए अंतर मानों पर विचार करना होगा।
Droid क्रिस

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/… - क्या आप कृपया इस C # को Java में हल कर सकते हैं?

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

UDP पर एक इंट भेजने के लिए कम से कम नीचे दिए गए काम।

int बाइट सरणी के लिए:

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;
}

बाइट सरणी करने के लिए int:

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
ObjectOutputStream का उपयोग गलत है। DataOutputStream का उपयोग करें, OOS का उपयोग इसे बनाता है इसलिए बाइट सरणी 4 बाइट्स नहीं है।
MeBigFatGuy

2

क्योंकि आम तौर पर आप बाद में एक बिंदु पर इस सरणी को इंट में बदलना चाहते हैं, यहाँ एक बाइट्स की एक सरणी को बाइट्स के एक सरणी में बदलने के तरीके हैं और इसके विपरीत:

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.Bytes के पास आसान बाइट [] रूपांतरण विधियों का एक समूह है, लेकिन आप इस उद्देश्य के लिए अपने प्रोजेक्ट में पूरे HBase जार को जोड़ना नहीं चाह सकते हैं। यह आश्चर्य की बात है कि इस तरह के न केवल एएफएआईके को जेडीके से गायब कर रहे हैं, बल्कि कॉमन्स io जैसे स्पष्ट हितों से भी गायब हैं।


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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.