java - copyof - 짧은 배열을 바이트 배열로 변환하는 방법



java array parameter (2)

ByteBuffer는 내가 프로파일 링 한 3 가지 중에서 가장 느린 변환 방법입니다. 아래 참조 ...

플랫폼 : Nexus S, Android 4.1.1, SIM 카드 없음

방법 1 : ByteBuffer 사용

byte [] ShortToByte_ByteBuffer_Method(short [] input)
{
  int index;
  int iterations = input.length;

  ByteBuffer bb = ByteBuffer.allocate(input.length * 2);

  for(index = 0; index != iterations; ++index)
  {
    bb.putShort(input[index]);    
  }

  return bb.array();       
}

방법 2 : Twiddle bits 직접

byte [] ShortToByte_Twiddle_Method(short [] input)
{
  int short_index, byte_index;
  int iterations = input.length;

  byte [] buffer = new byte[input.length * 2];

  short_index = byte_index = 0;

  for(/*NOP*/; short_index != iterations; /*NOP*/)
  {
    buffer[byte_index]     = (byte) (input[short_index] & 0x00FF); 
    buffer[byte_index + 1] = (byte) ((input[short_index] & 0xFF00) >> 8);

    ++short_index; byte_index += 2;
  }

  return buffer;
}

방법 3 : JNI를 통해 C 사용

TypeCast.java

package mynamespace.util;

public class TypeCast
{
  public static native byte [] shortToByte(short [] input);

  static
  {
    System.loadLibrary("type_conversion");
  }
}

native.c

#include <jni.h>
#include <string.h>

jbyteArray Java_mynamespace_util_TypeCast_shortToByte(JNIEnv *env, jobject obj, jshortArray input)
{
  jshort     *input_array_elements;
  int         input_length;

  jbyte      *output_array_elements;
  jbyteArray  output;

  input_array_elements = (*env)->GetShortArrayElements(env, input, 0);
  input_length         = (*env)->GetArrayLength(env, input);

  output                = (jbyteArray) ((*env)->NewByteArray(env, input_length * 2));
  output_array_elements = (*env)->GetByteArrayElements(env, output, 0);

  memcpy(output_array_elements, input_array_elements, input_length * 2);

  (*env)->ReleaseShortArrayElements(env, input, input_array_elements, JNI_ABORT);
  (*env)->ReleaseByteArrayElements(env, output, output_array_elements, 0);

  return output;
}

결과 :

1 백만 요소 입력 배열의 경우 실행 시간은 다음과 같습니다.

방법 1 ByteBuffer : 865 ms

방법 2 트위들 : 299 ms

방법 # 3 C : 39 ms

바이트 배열을 짧은 배열 로 변환 하고 바이트 배열을 짧은 배열 로 변환하지만 짧은 배열을 바이트 배열 로 변환 하지는 못했습니다.

다음은 전환까지 이어지는 코드입니다.

while(!stopped)
        { 
            Log.i("Map", "Writing new data to buffer");
            short[] buffer = buffers[ix++ % buffers.length];

            N = recorder.read(buffer,0,buffer.length);
            track.write(buffer, 0, buffer.length);

            byte[] bytes2 = new byte[N];

나는 노력했다.

              int i = 0;
              ByteBuffer byteBuf = ByteBuffer.allocate(N);
              while (buffer.length >= i) {
                  byteBuf.putShort(buffer[i]);
                  i++;
        }

bytes2 = byteBuf.array();

    ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(buffer);

그러나 나는이 오류를 둘 다받습니다 (정확하게 동일하지는 않지만 매우 비슷하지만 두 경우 모두 매우 비슷합니다).

05-29 13 : 41 : 12.021 : W / AudioTrack (9758) : obtainBuffer () 트랙 0x30efa0 사용 안 함, 다시 시작 중

05-29 13 : 41 : 12.857 : W / AudioWorker (9758) : 음성 읽기 오류 AudioWorker

05-29 13 : 41 : 12.857 : W / AudioWorker (9758) : java.nio.BufferOverflowException

05-29 13 : 41 : 12.857 : W / AudioWorker (9758) : java.nio.ShortBuffer.put (ShortBuffer.java:422)

05-29 13 : 41 : 12.857 : W / AudioWorker (9758) : java.nio.ShortToByteBufferAdapter.put (ShortToByteBufferAdapter.java:210)

05-29 13 : 41 : 12.857 : W / AudioWorker (9758) : java.nio.ShortBuffer.put (ShortBuffer.java:391)

05-29 13 : 41 : 12.857 : W / AudioWorker (9758) : com.avispl.nicu.audio.AudioWorker.run (AudioWorker.java:126)

그리고 가능한 한 많은 정보를 제공하기 위해 바이트 배열을 사용하는 코드가 있습니다.

Log.i("Map", "test");
                //convert to ulaw
                read(bytes2, 0, N);

                //send to server
                os.write(bytes2,0,bytes2.length);

                System.out.println("bytesRead "+buffer.length);
                System.out.println("data "+Arrays.toString(buffer));
            }

Java short 는 16 비트 유형이고, byte 는 8 비트 유형입니다. N 단락을 N 바이트 길이의 버퍼에 삽입하려고하는 루프가 있습니다. 모든 데이터에 맞게 2*N 바이트 길이가 필요합니다.

ByteBuffer byteBuf = ByteBuffer.allocate(2*N);
while (N >= i) {
    byteBuf.putShort(buffer[i]);
    i++;
}




arrays