2010-07-13 2 views
1

Мне нужна ваша помощь. Я хотел бы использовать следующий код, так как я разрабатываю звуковой инструмент (только для файлов .wav), основная функция которого отображает сигнал. Большой Endian, а также Little endian - это элементы, с которыми я не могу справиться. Правильно ли я думаю, что следующий код решает проблему таким образом, что: - если размер выборки аудио файла составляет 16 бит или 8 бит, а Большой конец или Маленький конец, он изменяет выборки с помощью массива audioData?Понимание большого endian, little endian (снова)

Если мои рассуждения верны, происходит ли перестановка всегда от большого конца до маленького конца?

Учитывается ли компьютерная архитектура? (Я имею в виду, если мой компьютер использует Little Endian, что происходит?)

Спасибо

int[] audioData = null; 

if (format.getSampleSizeInBits() == 16) { 
       int nlengthInSamples = audioBytes.size()/2; 
       audioData = new int[nlengthInSamples]; 
       // se Big Endian 
       if (format.isBigEndian()) { 
        for (int i = 0; i < nlengthInSamples; i++) { 
         // MSB calculation - Most Significant Bit 
         int MSB = (int) audioBytes.get(2 * i); 
         // LSB calculation - Least Significant Bit 
         int LSB = (int) audioBytes.get(2 * i + 1); 
         // (MSB << 8) MSB shift to the left by 8 position 
         // (255 & LSB) LSB masking so that LSB is <255 or =0 
         // putting both together 
         audioData[i] = MSB << 8 | (255 & LSB); 
        } 
       } else { 
        for (int i = 0; i < nlengthInSamples; i++) { 
         int LSB = (int) audioBytes.get(2 * i); 
         int MSB = (int) audioBytes.get(2 * i + 1); 
         audioData[i] = MSB << 8 | (255 & LSB); 
        } 
       } 

ответ

2

Все в Java является Big Endian, так что вам не нужно беспокоиться об этом. То, что у вас есть, кажется правильным (очевидно, проверьте его, чтобы быть уверенным), но я бы рекомендовал использовать следующий шаблон, чтобы избежать репликации кода в будущем.

int nlengthInSamples = audioBytes.size()/2; 
audioData = new int[nlengthInSamples]; 

// default BigEndian 
int MSB = (int) audioBytes.get(2 * i); 
int LSB = (int) audioBytes.get(2 * i + 1); 

// swap for Little Endian 
if(!format.isBigEndian()) { 
    int temp = MSB; 
    MSB = LSB; 
    LSB = temp; 
} 

audioData[i] = MSB << 8 | (255 & LSB); 
+0

Вам все еще нужна петля. –

Смежные вопросы