如何将短数组转换为字节数组

2024-01-01

我已经发现将短数组转换为字节数组 https://stackoverflow.com/questions/2188660/convert-short-to-byte-in-java, and 字节数组转短数组 https://stackoverflow.com/questions/5625573/byte-array-to-short-array-and-back-again-in-java,但不是短数组到字节数组。

这是导致转换的代码

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

and

    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): 读取语音时出错 音频工作者

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

我发现 ByteBuffer 是我所分析的三种转换方法中最慢的。见下文...

平台: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:直接旋转位

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

Results:

对于一百万个元素的输入数组,执行时间如下:

方法#1 ByteBuffer:865 毫秒

方法#2 旋转:299 毫秒

方法#3 C:39 毫秒

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将短数组转换为字节数组 的相关文章

随机推荐

  • 在 Javascript ECMAScript 6 中从类名创建对象

    我想使用 ES6 创建对象工厂 但旧式语法不适用于新语法 我有下一个代码 export class Column export class Sequence export class Checkbox export class Column
  • 3分钟了解什么是反射?

    许多 Net 面试问题列表 包括好的人 http www hanselman com blog WhatGreatNETDevelopersOughtToKnowMoreNETInterviewQuestions aspx 包含问题 什么是
  • java中的encode(, 'escape') PostgreSQL等效项是什么?

    我有一个 bytea 列存储在 Postgresql 数据库中 列名 测试 Ex x61736461640061736461736400 当我在选择查询中使用encode test escape 时 我得到这样的结果 Ex asdad 00
  • 使用字段重写无参数方法时出现空指针异常

    我正在研究 Scala 中的编程 它说您可以使用字段覆盖无参数方法 广告给出了以下示例 abstract class Element def contents Array String val height Int contents len
  • 使用正则表达式

    这个正则表达式有什么问题 我需要它使 name 仅包含字母数字 现在看来根本不起作用了 if preg match A Za z0 9 name e name must contain only letters or numbers 您需要
  • iPhone-SDK 的最佳 SQLite 3 教程在哪里? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何让我的应用程序使用 Windows 主题?

    我正在使用一些 Windows API 来创建一个小应用程序 我已经创建了按钮 窗口 好吧 但问题是我创建的组件看起来不像操作系统主题 它们看起来很简单 请参阅按钮作为示例 如何启用 Windows 主题 它可以是 C 语言或 Delphi
  • Sprite-Kit 在触摸屏幕时更改节点的图像

    有一个通过点击屏幕来控制的英雄 我希望每次触摸屏幕时英雄看起来都有点不同 我所做的是设置两个略有不同的图像 我希望在发生触摸事件时改变英雄的形象 到目前为止 我设置了一个数组来保存信息 但它有点行不通 NSMutableArray hero
  • 我们可以在 c++ 中使用 POSIX C 库吗?

    我是 Linux 系统编程领域的新手 我目前使用 C 编程 想切换到 C 我们可以在 c 中使用 POSIX C 库中定义的所有函数而不进行任何更改吗 原则您应该能够使用 C 中的任何 C API 该语言包含有利于它的功能 大多数 C 库作
  • 修改R中x轴上的日期格式?

    我想更改 R 中月份年份的绘图格式 所以目前它也显示日期 我只想显示月份年份 With my data http uploadeasy net upload 6nhi rar和 R 代码 plot alvdate 1250 1600 c N
  • .(data_type) 方法到底调用/做什么?

    我遇到了一段使用过的代码 string 方法 不知道这叫什么 我很难找到它 这是我尝试理解的 package main import fmt import reflect func main var b interface b silly
  • html5 视频的 timeupdate 事件多久触发一次

    学习html5的东西 太棒了 想知道 timeupdate 事件触发的频率 旁注 js 视频 API 有很多有趣的可能性 例如 可以使用 ctrl F 来搜索视频 运行语音识别作为视频处理的一部分 然后创建一个长键值存储 其中时间戳作为键
  • 请说明为什么在字符串的情况下,字符串对象的两个引用是相同的(代码写在下面)

    using System using System Collections using System Configuration using System Data using System Linq using System Web us
  • Python 中的多元求根

    使用 Excel 求解器 很容易找到该方程的解 x 和 y 的最佳值 x 14 80461 y 4 9233 10 0 4803 0 但是 我不知道如何在 Python 中执行此操作 现有的 scipy 优化库函数 如 fsolve 或 l
  • 为什么相互让步使 ArrowApply 和 Monads 等效,而不像 Arrow 和 Applicative?

    这是我要参考的SO帖子 https stackoverflow com a 24668518 11143763 另外 我将使用与该问题中的OP相同的片段 以免分离材料 https stackoverflow com q 24668313 1
  • gitignore 跨所有分支?

    嘿 我正在尝试进入 git 作为 emacs 用户 首先要做的就是确保 git 忽略 和 文件 文档讨论了我一直在使用的 gitignore 然而 仍然有几个问题 gitignore 现已签入并部分 的一个分支 gitignore 应该是
  • Ruby HTTP 获取参数

    如何通过 ruby 发送带参数的 HTTP GET 请求 我尝试了很多例子 但都失败了 我知道这篇文章已经很旧了 但是为了那些由 google 带到这里的人 有一种更简单的方法可以以 URL 安全的方式对参数进行编码 我不知道为什么我没有在
  • 异或 Java 神经网络

    尝试使用 Java 中的 XOR 神经网络 但网络总是预测其训练的最终输出 这是我的代码 for int i 0 i lt 4 i Forward pass diff 1 while diff gt 0 01 SumError 0 Y1 I
  • 比较 MySQL 和 Java 时间

    我在 MySQL 中有一个日期时间字段 我通过调用 result getString date 访问它 现在我想检查天气 Java 中的当前日期和时间已经超过 MySQL 时间或早于 MySQL 时间来检查天气结果是否激活 MySQL 中的
  • 如何将短数组转换为字节数组

    我已经发现将短数组转换为字节数组 https stackoverflow com questions 2188660 convert short to byte in java and 字节数组转短数组 https stackoverflo