2013-02-12 53 views
17

मेरे पास एक बाइट सरणी है जहां सरणी में डेटा वास्तव में छोटा डेटा है। बाइट्स थोड़ा endian में आदेश दिया जाता है:छोटे मूल्यों में छोटे अंतराल क्रम में बाइट सरणी मानों को कनवर्ट करना

3, 1, -48, 0, -15, 0, 36, 1

कौन सा जब में कम मूल्यों परिणाम में बदला:

259, 208, 241, 2 9 2

क्या बाइट मानों को उनके संबंधित लघु मानों में परिवर्तित करने के लिए जावा में कोई आसान तरीका है? मैं एक लूप लिख सकता हूं जो केवल हर उच्च बाइट लेता है और इसे 8 बिट्स द्वारा स्थानांतरित करता है और या इसके कम बाइट के साथ इसे बदलता है, लेकिन इसका प्रदर्शन हिट होता है।

+2

आप दे दिया है 8 बाइट्स, और फिर 4 लम्बे ... जबकि 8 बाइट्स केवल एक * एकल * लंबे मूल्य में परिणाम होना चाहिए। इसके अतिरिक्त, आपने जो कहा वह आपने नहीं कहा है। असल में आपका प्रश्न इस समय बहुत अस्पष्ट है ... –

+1

नहीं, यह अस्पष्ट नहीं है। आपके पास बाइट सरणी से डेटा है और यह क्या बदलता है। उससे ज्यादा स्पष्ट नहीं हो सकता है। – AndroidDev

+8

हां, यह कर सकता है। क्योंकि ऐसा लगता है कि आप वास्तव में * शॉर्ट' में परिवर्तित हो रहे हैं, न कि 'लंबा' ... और आपने यह नहीं कहा है कि आप क्या उम्मीद कर रहे हैं * परिणाम। इस सवाल को किसी भी स्पष्ट न करने के लिए स्वतंत्र महसूस करें - लेकिन याद रखें कि आप मदद की तलाश में हैं, और आपका प्रश्न जितना बेहतर होगा, उतना ही बेहतर होगा कि मदद की संभावना है। –

उत्तर

38

java.nio.ByteBuffer के साथ आप अपनी इच्छितता निर्दिष्ट कर सकते हैं: order()

ByteBuffer बाइट, चार, getShort(), getInt(), लंबे, डबल के रूप में डेटा निकालने के तरीकों है ...

यहाँ एक उदाहरण है कि यह कैसे उपयोग करने के लिए:

ByteBuffer bb = ByteBuffer.wrap(byteArray); 
bb.order(ByteOrder.LITTLE_ENDIAN); 
while(bb.hasRemaining()) { 
    short v = bb.getShort(); 
    /* Do something with v... */ 
} 
+1

धन्यवाद। बहुत मदद की किसी को यह देखने में खुशी हुई कि कोई व्यक्ति आसानी से सवाल समझ सकता है। बहुत - बहुत धन्यवाद। – AndroidDev

+1

(प्रश्न में नमूना डेटा के अनुसार बस * getLong() 'को * * * * कन्वर्ट करने की अपेक्षा न करें। आप इसके लिए 'getShort()' को कॉल करना चाहते हैं।) –

+0

दरअसल, मुझे GetShort चाहिए जो देता है मुझे परिणाम फिर भी, आपका समाधान सही है। – AndroidDev

0
/* Try this: */ 
public static short byteArrayToShortLE(final byte[] b, final int offset) 
{ 
     short value = 0; 
     for (int i = 0; i < 2; i++) 
     { 
      value |= (b[i + offset] & 0x000000FF) << (i * 8); 
     }    

     return value; 
} 

/* if you prefer... */ 
public static int byteArrayToIntLE(final byte[] b, final int offset) 
{ 
     int value = 0; 

     for (int i = 0; i < 4; i++) 
     { 
      value |= ((int)b[i + offset] & 0x000000FF) << (i * 8); 
     } 

     return value; 
}