【问题标题】:How to convert audio string back to audio bytes in java如何在java中将音频字符串转换回音频字节
【发布时间】:2018-12-21 16:26:26
【问题描述】:

录制的音频字节数与 HTTP 请求正文一起发送。当服务器端收到请求时,音频数据如下所示:

\u0000\u0000\u0000\u0000\u0000\u0000��\u0002\u0000������4\u0000M\u0000@\u0000%\u0000\u0014\u0000����������\u0015\u0000M\u0000r\u0000�\u0000_\u0000C\u0000^\u0000V\u0000\u0007\u0000��\"\u0000;\u0000>\u0000\u0005\u0000����������������\f\u0000+\u0000K\u0000e\u0000.\u0000������������\u0003\u0000\b\u0000����������\"\u0000G\u0000V\u0000(\u0000 \u0000\u0004\u0000����������\u0003\u0000W\u0000�\u0000Z\u0000a\u0000{\u0000,\u0000��������\u001E\u0000��������1\u0000\u001A\u0000\u0011\u0000(\u0000/\u0000\u0016\u0000��������0\u0000/\u00002\u0000;\u0000������d�������\u001F\u00009\u00006\u0000j\u0000[\u0000'\u0000������������\u000E\u00009\u0000%\u0000����\u0015\u0000(\u00003\u0000+\u0000'\u0000������<\u0000F\u0000=\u0000h\u0000�\u0000M\u0000��������������T\u0000i\u0000]

如何将此字符串转换回原始音频数据字节?

我尝试调用 getBytes(),但似乎不正确。

----- 编辑-----

发布 HTTP 请求的代码会太长。我将在这里引用一个简短的示例。

public static void main(String args[]) throws Exception
{
    byte[] test = new byte[]{(byte)0xfc, (byte)0xff, (byte)0xff, (byte)0xff};

    String testString = new String(test);

    System.out.println(testString);

    System.out.println(getHexString(testString.getBytes()));
}

public static String getHexString(byte[] bytes) 
{
    char[] hexArray = "0123456789ABCDEF".toCharArray();
    char[] hexChars = new char[bytes.length * 2];

    for ( int j = 0; j < bytes.length; j++ ) 
    {
        int v = bytes[j] & 0xFF;

        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }

    return new String(hexChars);
}

上面的代码给出了以下结果

����
EFBFBDEFBFBDEFBFBDEFBFBD

当我将字节 FC、FF、FF、FF 转换为字符串时,我得到 ����。当我将字符串转换回字节时,我得到 EF BF BD EF BF BD EF BF BD EF BF BD。我想从����获取原始字节 FC、FF、FF、FF。

【问题讨论】:

  • 这很大程度上取决于编码、文件格式等细节,最重要的是:您的 http 请求是如何构建的。请提供minimal reproducible example,现在你的问题是“你好医生,我的猫发出奇怪的声音。现在告诉我她怎么了”。
  • 如果您可以发布用于在客户端生成 HTTP 请求的代码,也许有人可以提供帮助。
  • @GhostCat 嗨,我刚刚编辑了我的问题。
  • @user31601 嗨,我刚刚编辑了我的问题
  • bytesigned 类型。 0xFF 不是有效字节!

标签: java string javasound


【解决方案1】:

字符串用于表示文本。音频数据不是文本。尽可能尝试,不可能将一些音频数据放入字符串中,然后尝试从字符串中提取音频数据。它被设计为无法工作。

由于您要处理的音频数据不是文本,因此您没有理由让 String 参与该过程。忘掉字符串吧,你现在知道它们不是一个适合你目标的工具,所以完全不管它们。音频等二进制数据可以表示为字节序列。比如 byte[] 数组。

删除变量String testString。不要构建它,不要声明它,完全删除它。它是一个字符串,你不能将字符串用于你的目标,所以摆脱它。

相反,让我们专注于使用您的变量byte[] test。它已经是一个 byte[] 并且包含所有数据。所以这就是你所需要的。

您可以使用System.out.write(test); 编写它,但在控制台中这不是很有用。不过,在套接字的 OutputStream 中,这是完美的。

或者你可以写出它的十六进制编码版本:

System.out.println(getHexString(test));

在这里您可以获得功能齐全的结果。将它们解码回字节将为您提供您开始使用的确切字节。

【讨论】:

  • 我同意,您在这里抓住了字符串的基本问题。但是后来:我们真的不知道这些音频数据是如何通过他的 http 请求进入的。换句话说:您解决了问题中实际上可以回答的那些部分。还有什么不清楚...
  • @GhostCat 当然。尽管如此,重要的是要说和坚持:字符串是处理非文本二进制文件的错误工具。如果您正在使用非文本二进制文件,并且在某个时候将其放入字符串中,那么您就失败了,您的程序将无法运行。既然这是必然的结果,那么,不要将 String 用于除文本之外的任何其他内容。
猜你喜欢
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
相关资源
最近更新 更多