java - बाइट सरणी लघु सरणी और जावा में फिर से वापस




arrays byte (4)

आपका कोड छोटे-छोटे शॉर्ट्स कर रहा है, बड़ा नहीं। आपके पास एमएसबी और एलएसबी के लिए इंडेक्सिंग है।

चूंकि आप बड़े-एंडियन शॉर्ट्स का उपयोग कर रहे हैं, इसलिए आप अपने स्वयं के डिकोडिंग करने के बजाए, दूसरी छोर पर एक बाइटएरे इनपुट इनपुट (और डेटाऑटपुटस्ट्रीम / बाइटएरे ऑटपुटस्ट्रीम) के चारों ओर लिपटे डेटा इनपुटपुट का उपयोग कर सकते हैं।

यदि आप काम करने वाले हर दूसरे डिकोड को प्राप्त कर रहे हैं, तो मुझे लगता है कि आपके पास बाइट्स की एक विषम संख्या है, या एक-एक-एक त्रुटि कहीं और है जो आपकी गलती को हर दूसरे पास पर ठीक करने का कारण बन रही है।

अंत में, मैं सरणी के माध्यम से i + = 2 के साथ कदम उठाता हूं और 2 से गुणा करने के बजाय एमएसबी = एआर [i] और एलएसबी = एआर [i + 1] का उपयोग करता हूं, लेकिन यह सिर्फ मुझे है।

मुझे बाइट सरणी में संग्रहीत ऑडियो डेटा लेने में कुछ समस्याएं आ रही हैं, इसे एक बड़े-एंडियन शॉर्ट सरणी में परिवर्तित करना, इसे एन्कोड करना, फिर उसे बाइट सरणी में बदलना। यही सब कुछ मेरे पास है। मूल ऑडियो डेटा ऑडियोबाइट 2 में संग्रहीत किया जाता है। मैं इसके बजाय कॉस फ़ंक्शन पर एक ऋण के साथ डीकोड के लिए एक ही प्रारूप का उपयोग कर रहा हूं। दुर्भाग्यवश, बाइट और लघु डेटा प्रकारों को बदलना गैर-विचारणीय है।

    short[] audioData = null;
    int nlengthInSamples = audioBytes2.length / 2;
    audioData = new short[nlengthInSamples];

    for (int i = 0; i < nlengthInSamples; i++) {
       short MSB = (short) audioBytes2[2*i+1];
       short LSB = (short) audioBytes2[2*i];
       audioData[i] = (short) (MSB << 8 | (255 & LSB));
    }

    int i = 0;
    while (i < audioData.length) {
        audioData[i] = (short)(audioData[i] + (short)5*Math.cos(2*Math.PI*i/(((Number)EncodeBox.getValue()).intValue())));
        i++;
    }

    short x = 0;
    i = 0;
    while (i < audioData.length) {
        x = audioData[i];
        audioBytes2[2*i+1] = (byte)(x >>> 0);
        audioBytes2[2*i] = (byte)(x >>> 8);
        i++;
    }

मैंने यह सब कुछ किया है जिसे मैं इस काम को करने के बारे में सोच सकता हूं, लेकिन निकटतम मैं इसे हर दूसरे एन्कोड / डीकोड पर काम करने के लिए प्राप्त कर रहा हूं और मुझे नहीं पता कि क्यों। किसी भी मदद के लिए धन्यवाद।


ऐसा लगता है कि आप बाइट्स को पढ़ने और उन्हें वापस लिखने के बीच बाइट ऑर्डर को स्वैप कर रहे हैं (अनिश्चित है कि यह जानबूझकर है या नहीं)।


मैं यह भी सुझाव देता हूं कि आप बाइटबफर का प्रयास करें।

byte[] bytes = {};
short[] shorts = new short[bytes.length/2];
// to turn bytes to shorts as either big endian or little endian. 
ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);

// to turn shorts back to bytes.
byte[] bytes2 = new byte[shortsA.length * 2];
ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(shortsA);

byte[2] bytes;

int r = bytes[1] & 0xFF;
r = (r << 8) | (bytes[0] & 0xFF);

short s = (short)r;




short