理解big endian,little endian(再次)

时间:2010-07-13 20:52:41

标签: java audio

我需要你的帮助。 我想使用以下代码,因为我正在开发一个音频工具(仅适用于.wav文件) 主要特征是显示信号波形。 Big Endian以及Little endian是我无法应付的元素。 我是否正确地认为以下代码以下列方式解决问题: - 如果音频文件样本大小是16位或8位,还是Big endian或Little endian,它会使用audioData数组重新排列样本吗?

如果我的推理是正确的,重排是否总是从大端到小端?

计算机架构是否被考虑在内? (我的意思是如果我的电脑使用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 个答案:

答案 0 :(得分: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);