बाइट सरणी को उसके संख्यात्मक मान (जावा) में कैसे बदलें?


89

मेरे पास एक 8 बाइट सरणी है और मैं इसे इसके संबंधित संख्यात्मक मान में बदलना चाहता हूं।

जैसे

byte[] by = new byte[8];  // the byte array is stored in 'by'

// CONVERSION OPERATION
// return the numeric value

मैं एक ऐसी विधि चाहता हूं जो उपरोक्त रूपांतरण ऑपरेशन को अंजाम दे।


4
"संख्यात्मक मान" से आपका क्या तात्पर्य है? बाइट्स बाइनरी में एक पूर्णांक (लंबे) या फ्लोटिंग पॉइंट नंबर (डबल) का प्रतिनिधित्व करते हैं? क्या वे एक संख्या के स्ट्रिंग प्रतिनिधित्व हैं? या फिर एक और प्रतिनिधित्व?
स्टारब्लू

1
यह मददगार था: stackoverflow.com/questions/5399798/…
TacB0sS

NB: TacB0s 'लिंक मैं वास्तव में आगे और पीछे रूपांतरण दोनों के लिए देख रहा था।
जे टेलर टेलर

new BigInteger(by).longValue()
लोरेन

जवाबों:


106

पहला बाइट मान लेना सबसे महत्वपूर्ण बाइट है:

long value = 0;
for (int i = 0; i < by.length; i++)
{
   value += ((long) by[i] & 0xffL) << (8 * i);
}

क्या पहला बाइट सबसे महत्वपूर्ण है, तो यह थोड़ा अलग है:

long value = 0;
for (int i = 0; i < by.length; i++)
{
   value = (value << 8) + (by[i] & 0xff);
}

यदि आप 8 से अधिक बाइट्स रखते हैं, तो BigInteger के साथ लंबे समय से बदलें ।

मेरी त्रुटियों के सुधार के लिए हारून दिगुल्ला को धन्यवाद।


8
-1 बाइट्स पर हस्ताक्षर किए गए मूल्य हैं! और शिफ्ट (<<) के साथ पॉव () बदलें! "मान = (मान << 8) + ([i] और 0xff द्वारा)"
हारून दिगुलना

क्या शिफ्ट ऑपरेटर (<<) के पास दाएं से बाएं प्राथमिकता है? उपरोक्त कोड कैसे काम करता है? इसका काम करना मेरे लिए सब ठीक है। बस काम करना जानते हैं। अग्रिम रूप से
थैंक्स

@Mnementh: क्या शिफ्ट ऑपरेटर (<<) के पास दाएं से बाएं पूर्वता है? उपरोक्त कोड कैसे काम करता है? इसका काम करना मेरे लिए सब ठीक है। बस काम करना जानते हैं। अग्रिम में
थानक्स

5
मामले में किसी और के पास वही मुद्दा है जो मैंने किया था, पहले उदाहरण में, [i] द्वारा इसे लंबे समय तक डाला जाना चाहिए, अन्यथा यह केवल 2 ^ 32 से कम के मानों के लिए काम करता है। वह है,value += ((long)by[i] & 0xffL) << (8 * i);
लूका

115

कोई रूपांतरण के प्रदर्शन Bufferके लिए java.nioपैकेज के हिस्से के रूप में प्रदान किए गए s का उपयोग कर सकता है ।

यहां, स्रोत byte[]सरणी की लंबाई 8 है, जो आकार है जो एक longमूल्य से मेल खाती है ।

सबसे पहले, byte[]सरणी को एक में लपेटा जाता है ByteBuffer, और फिर मूल्य ByteBuffer.getLongप्राप्त करने के लिए विधि को बुलाया जाता है long:

ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();

System.out.println(l);

परिणाम

4

मैं ByteBuffer.getLongटिप्पणियों में विधि को इंगित करने के लिए dfa को धन्यवाद देना चाहूंगा ।


हालाँकि यह इस स्थिति में लागू नहीं हो सकता है, एस की सुंदरता Bufferकई मूल्यों के साथ एक सरणी को देखने के साथ आती है।

उदाहरण के लिए, यदि हमारे पास एक 8 बाइट सरणी है, और हम इसे दो intमूल्यों के रूप में देखना चाहते थे , तो हम byte[]सरणी को एक में लपेट सकते हैं ByteBuffer, जिसे एक के रूप में देखा जाता है IntBufferऔर इसके द्वारा मान प्राप्त करते हैं IntBuffer.get:

ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4});
IntBuffer ib = bb.asIntBuffer();
int i0 = ib.get(0);
int i1 = ib.get(1);

System.out.println(i0);
System.out.println(i1);

परिणाम:

1
4

क्या बारे में ByteBuffer.wrap (नई बाइट [] {0, 0, 0, 1, 0, 0, 4})। getLong ()? इस विधि को अगले 8 बाइट को पढ़ना चाहिए और उन्हें
दफा

@ डफा: इस ओर इशारा करने के लिए धन्यवाद, यह निश्चित है कि काम करने के लिए लगता है - मैं जवाब को संपादित करूँगा। :)
कोबर्ड

16

यदि यह एक 8-बाइट्स संख्यात्मक मान है, तो आप कोशिश कर सकते हैं:

BigInteger n = new BigInteger(byteArray);

यदि यह UTF-8 वर्ण बफर है, तो आप कोशिश कर सकते हैं:

BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));

अगर यह पहली बार कोड स्निपेट के ठीक बाद समाप्त हो जाता है, या यदि यह स्ट्रिंग को "संख्यात्मक मान" में बदलने के लिए कुछ कोड शामिल करता है, तो मुझे इस उत्तर के लिए वोट दिया जाएगा। जैसा कि, आपके उत्तर का उत्तरार्ध एक गैर अनुक्रमिक की तरह लगता है।
लॉरेंस गोंसाल्वेस

पहली जगह में मेरा मतलब नहीं था, मैंने अपना जवाब बदल दिया
विंसेंट रॉबर्ट

15

बस, आप Google द्वारा उपलब्ध कराए गए अमरूद के लिए उपयोग या संदर्भित कर सकते हैं , जो लंबी और बाइट सरणी के बीच रूपांतरण के लिए बिलकुल तरीके प्रदान करता है। मेरा ग्राहक कोड:

    long content = 212000607777l;
    byte[] numberByte = Longs.toByteArray(content);
    logger.info(Longs.fromByteArray(numberByte));


9

तुम भी चर लंबाई बाइट्स के लिए BigInteger का उपयोग कर सकते हैं। आप इसे लॉन्ग, इंटेगर या शॉर्ट में बदल सकते हैं, जो भी आपकी आवश्यकताओं के अनुरूप हो।

new BigInteger(bytes).intValue();

या ध्रुवीयता को निरूपित करने के लिए:

new BigInteger(1, bytes).intValue();


1

सरणी में प्रत्येक सेल को अहस्ताक्षरित int के रूप में माना जाता है:

private int unsignedIntFromByteArray(byte[] bytes) {
int res = 0;
if (bytes == null)
    return res;


for (int i=0;i<bytes.length;i++){
    res = res | ((bytes[i] & 0xff) << i*8);
}
return res;
}

बस एक नोट जो मुझे 0xFFL का उपयोग करने के लिए आवश्यक था, अन्यथा जब 0xFF से लंबे समय तक इंट में पूरी तरह से गलत 1 बिट्स सेट होता था जब मैंने Long.toHexString (l) मुद्रित किया था।
ल्यूक

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