0

我正在尝试编写一个可以从网页响应中读取不同类型编码的程序。现在我正试图弄清楚如何成功读取 AMF 数据的响应。发送它没问题,使用我的 HttpWrapper,它可以很好地获取响应字符串,但是许多字符在翻译中丢失了。为此,我试图以字节形式接收响应,然后转换为可读文本。

我得到的最重要的事情是字符在翻译中迷失了,字面意思。我使用了一个名为 Charles 3.8.3 的程序来帮助我了解我应该在响应中看到什么,无论是十六进制还是 AMF。对于普通字符通常没问题,但每当看到非 unicode 字符时,我总是得到“ef bf bd”。我读取 HTTP 响应的代码如下:

BufferedReader d = new BufferedReader(new InputStreamReader(new    DataInputStream(conn.getInputStream())));
while (d.read() != -1) {
String bytes = new String(d.readLine().getBytes(), "UTF-8");
    result += bytes;
}

然后我尝试将其转换为十六进制,如下所示:

for (int x = 0; x < result.length(); x++) {
    byte b = (byte) result.charAt(x);
    System.out.print(String.format("%02x", b & 0xFF));
}

我的输出是: 0000000001000b2f312f6f6e526573756c7400046e756c6c00000**bf** 而查尔斯 3.8.3 是: 0000000001000b2f312f6f6e526573756c7400046e756c6c00000

我对如何解决这个问题束手无策,所以任何帮助将不胜感激!感谢您的时间

4

2 回答 2

2

看起来您正在使用 readLine() 因为您习惯于使用文本。维基百科说 AMF 是一种二进制编码,所以你应该能够做这样的事情,而不是通过编码/解码 noop(你需要使用 ISO-8859-1,而不是 UTF-8 才能工作)用字符串。

ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[2048];


try (InputStream in = conn.getInputStream()) {
    int read;
    while ((read = in.read(buffer)) >= 0) {
        out.write(buffer, 0, read);
    }
}

out.toByteArray();

// Convert to hex if you want.
于 2014-06-21T07:31:00.367 回答
1

您的代码假定每个流都使用 UTF-8 编码。这是完全不正确的。您将需要检查内容类型响应标头字段。

于 2014-06-21T06:25:44.353 回答