tableau d'octets à court de tableau et d'en revenir en java
Je vais avoir quelques problèmes de prise de données audio stockées dans un tableau d'octets, de la convertir vers un big-endian court tableau, d'encoder, puis, changeant de retour dans un tableau d'octets. Voici ce que j'ai. Les données audio d'origine est stocké dans audioBytes2. Je suis en utilisant le même format pour décoder avec un moins sur la fonction cos au lieu. Malheureusement, les changements de l'octet et types de données court, c'est non négociable.
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++;
}
J'ai fait tout ce que je peux penser à faire ce travail, mais le plus proche que je suis venu, c'est la faire fonctionner tous les autres encoder/décoder et je n'ai aucune idée pourquoi. Merci pour toute aide.
- Quels problèmes rencontrez-vous?
- est-ce big-endian ou little-endian? Je pense que vous avez besoin
java.nio.ByteBuffer
pour gérer cette conversion. - Double Possible de comment faire pour convertir court tableau de tableau d'octets
Vous devez vous connecter pour publier un commentaire.
Je vous conseille aussi d'essayer ByteBuffer.
ShortBuffer
agit comme un vue sur un sous-jacentByteBuffer
, et songet()
méthode de faire exactement ce que vous voulez).short[]
ou similaire primitive array pour correspondre à la XxxxxBuffer.byte[] bytes = {};
pseudo-code pour l'ensemble des octets à quelque chose? Est-ce standard Java stackoverflow?byte[] bytes = new byte[0];
Comment quelques-uns ByteBuffers?
Votre code est fait little-endian shorts, pas grand. Vous avez l'indexation pour le MSB et LSB échangé.
Puisque vous êtes à l'aide de big-endian shorts, vous pourriez être l'aide d'un DataInputStream enroulé autour d'une ByteArrayInputStream (et DataOutputStream/ByteArrayOutputStream) à l'autre extrémité, plutôt que de faire votre propre décodage.
Si vous obtenez tous les autres décoder de travail, je suppose que vous avez un nombre impair d'octets, ou un tout-en-un erreur d'ailleurs qui est la cause de votre erreur se fixe sur tous les autres à passer.
Enfin, je montais dans le tableau i+=2 et de l'utilisation de l'ESM= arr[i] et LSB=arr[i+1] plutôt que de multiplier par 2, mais c'est juste moi.
On dirait que vous êtes la permutation de l'ordre des octets entre la lecture d'octets et de l'écriture de nouveau (pas sur si c'est intentionnel ou pas).