2013-10-27 7 views
5

मैं बाइट [] को बाइट [] में बाइट [] में बाइट [] डालकर एक फ्लोटबफर में परिवर्तित करके [] एक फ्लोटबफर (.asFloatBuffer) में कनवर्ट करने की कोशिश कर रहा हूं, और फिर कनवर्ट करना यह एक सरणी के लिए।बाइट [] को फ़्लोट करने के साथ असमर्थित ऑपरेशन अपवाद []

private static float[] toFloatArray(byte[] bytes) { 
    ByteBuffer buffer = ByteBuffer.wrap(bytes); 
    return buffer.asFloatBuffer().array(); 
} 

हालांकि चल:

byte[] bytes = {14,32,26,21}; 
      toFloatArray(bytes); 

मुझे एक java.lang.UnsupportedOperationException at java.nio.FloatBuffer.array(Unknown Source) देता है। मेरा मानना ​​है कि प्रलेखन कहता है कि त्रुटि में बफर के साथ कुछ करना है जो किसी सरणी (???) द्वारा समर्थित नहीं है।

किसी को भी यह पता है कि इसे कैसे ठीक किया जाए, या मुझे इस सरणी को फ्लोट में कैसे परिवर्तित करना चाहिए?

+0

मुझे लगता है कि आपको "गहरा" और एक बाइट [] के बजाय शुरू करने के लिए एक फ्लोट [] प्राप्त करने की कोशिश कर रहा है। इसे छोड़कर, जब तक आप इनपुट से बाहर नहीं हो जाते, तब तक आप लपेटकर बफर पर #getFloat() को कॉल कर सकते हैं। – Max

उत्तर

6
private static float[] toFloatArray(byte[] bytes) { 
     ByteBuffer buffer = ByteBuffer.wrap(bytes); 
     FloatBuffer fb = buffer.asFloatBuffer(); 

     float[] floatArray = new float[fb.limit()]; 
     fb.get(floatArray); 


     return floatArray; 
    } 

पूर्व:

 byte[] bytes = {65,-56,0,0 , 65,-56,0,0}; 
    float[] result = toFloatArray(bytes); 

    //print 25.0 25.0 
    System.out.println(Arrays.toString(result)); 
+0

यह बहुत अच्छा काम करता है! दूसरा जवाब भी अच्छा है, लेकिन मैं इसे पसंद करता हूं क्योंकि कोई लूप आवश्यक नहीं है। – user717572

1

एक byte[] सरणी एक ByteBuffer से लिपटे से एक float प्राप्त करने के लिए सरल तरीका getFloat() जो अगले 4 बाइट पढ़ता है और उत्पन्न float रिटर्न उपयोग करने के लिए है। यदि आप अपने byte[] में 4 बाइट्स से अधिक हैं, तो आप इसे लूप में कर सकते हैं। ध्यान दें कि विधि फेंकता

BufferUnderflowException - अगर वहाँ चार से कम बाइट्स इस बफर में शेष हैं

साथ ही आप FloatBuffer से प्राप्त कर सकते हैं

buffer.asFloatBuffer().get(); 

अगर आप चाहते हैं लेकिन array()UnsupportedOperationException फेंकता है यदि इंस्टेंस का hb फ़ील्डहै। आप ओरेकल JDK 7 से स्रोत कोड को देखो, तो वहाँ एक टिप्पणी है

final float[] hb; // Non-null only for heap buffers 

आप अपने कोड चलाते हैं, तो आप देखेंगे लौटे FloatBuffer एक ByteBufferAsFloatBufferB, नहीं एक HeapFloatBuffer है।

+0

मैं कल यह कोशिश करूंगा। लेकिन अगर मैं इसे सही ढंग से समझता हूं, asFloatBuffer() वास्तव में प्रकार को रूपांतरित नहीं करता है, लेकिन केवल बाइट सरणी का अर्थ कैसे बदलता है? – user717572

+0

@user इसे पसंद करता है। जावाडोक कहता है 'इस बाइट बफर का एक फ्लोट बफर के रूप में एक दृश्य बनाता है।' –

+0

हां, यही कारण है कि जब आप" ByteBuffer.wrap (बाइट्स) .asFloatBuffer()। Array(); " क्योंकि वास्तव में बाइट्स आवंटित स्मृति है। यह एक ही स्मृति को इंगित करने के लिए एक फ्लोट [] और बाइट [] सरणी की अनुमति नहीं दे सकता है। – Tatarize

0
public static float[] toFloatArray(byte[] bytes) { 
    float[] floats = new float[bytes.length/4]; 
    ByteBuffer.wrap(bytes).asFloatBuffer().get(floats).array(); 
    return floats; 
} 

कारण है कि आप return ByteBuffer.wrap(bytes).asFloatBuffer().array(); ऐसा नहीं कर सकते कि यह एक नाव बफर के रूप में इस बाइट बफर के एक दृश्य बनाता है। जिसका अर्थ है कि यह एक ही स्मृति का उपयोग कर रहा है। यह बिजली तेज है, लेकिन इसे स्मृति में रखने के लिए एक जगह की जरूरत है जिसे फ्लोट [] और बाइट []] के रूप में नहीं माना जा रहा है, इसलिए यह आपको नई स्मृति के बिना डेटा वापस क्यों नहीं दे सकता है।

public static void convertFloatArray(byte[] bytes, float[] floats) { 
    ByteBuffer.wrap(bytes).asFloatBuffer().get(floats,0,bytes.length/4); 
} 

यह सिर्फ वर्ग का अपना स्मृति नहीं है, लेकिन स्मृति आप इसे देना है, जो भयानक है साथ fiddles, लेकिन कई बार भ्रमित किया जा सकता है।

संबंधित मुद्दे