Понимание big endian, little endian (снова) - PullRequest
1 голос
/ 14 июля 2010

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

Учитывается ли архитектура компьютера?(Я имею в виду, если мой компьютер использует 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);
                    }
                }

1 Ответ

2 голосов
/ 14 июля 2010

Все в 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...