gpt4 book ai didi

java - 理解大端、小端(再次)

转载 作者:行者123 更新时间:2023-11-30 05:11:24 25 4
gpt4 key购买 nike

我需要你的帮助。我想使用以下代码,因为我正在开发一个音频工具(仅适用于 .wav 文件),其主要功能是显示信号波形。大端和小端是我无法控制的元素。我认为以下代码解决问题的方式是正确的:- 如果音频文件样本大小为 16 位或 8 位,并且为大端或小端,它会使用 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);
}
}

最佳答案

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);

关于java - 理解大端、小端(再次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3241434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com