如何在Java中将音频字符串转换回音频字节

时间:2018-07-13 09:59:48

标签: java string javasound

记录的音频字节与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 BD EF BF BD EF BF BD。我想从����获取原始字节FC,FF,FF,FF。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

或者您可以使用以下方式写出它的十六进制编码版本:

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

在这里您可以获得完整的功能结果。将它们解码回字节将完全给您开始时使用的字节。