如何将音频字符串转换回 java 中的音频字节

How to convert audio string back to audio bytes in java

录制的音频字节与 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.

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

由于您要处理的音频数据不是文本,因此您没有理由希望在此过程中涉及 String。忘掉 Strings,你现在知道它们不是适合你目标的工具,所以完全不要管它们。音频等二进制数据可以表示为 字节序列 。例如byte[]数组。

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

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

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

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

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

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