Почему метод ByteBuffer putShort (значение) работает неправильно в моем случае?

Моя задача состоит в том, чтобы преобразовать short [] массив в массив byte [], потому что нужно отправлять байты через сокет. Это байты для AudioTrack (Android). Для конвертирования используйте этот пост , в частности это и этот. Этот метод дает только белый шум при попытке преобразовать short в массив байтов:

val sampleBuffer = decoder.decodeFrame(frameHeader, bitstream) as SampleBuffer val pcm = sampleBuffer.buffer //pcm is short[] array byteBuf = ByteBuffer.allocate(pcm.size * 2) // because 1 short = 2 bytes while (pcm.size > i) { byteBuf.putShort(pcm[i]) i++ } auddioTrack.write(byteBuf.array(), 0, byteBuf.limit()); 

Но этот конвертер отлично работает:

 var i = 0 val byteBuf = ByteBuffer.allocate(pcm.size * 2) val buff = ByteBuffer.allocate(2) //pcm size equals 2304 while (pcm.size > i) { // byteBuf.putShort(pcm[i]) byteBuf.put(byteArrayOf((pcm[i].toInt() and 0x00FF).toByte(), ((pcm[i].toInt() and 0xFF00) shr (8)).toByte())) i++ } auddioTrack.write(byteBuf.array(), 0, byteBuf.limit()); 

Почему это произошло?

byteBuf.array().size вернет размер буфера ( pcm.size * 2 ) независимо от того, было ли записано столько байтов в буфер. Вероятно, вы хотите использовать byteBuf.limit() .