无法从网页响应中读取字节(amf)

时间:2014-06-20 20:22:08

标签: java http amf datainputstream inputstreamreader

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

我得到的最重要的事情就是角色在翻译中会丢失。我使用一个名为Charles 3.8.3的程序来帮助我了解我应该在响应中看到的内容,包括hex-wise和AMF-wise。它在普通字符方面通常很好,但每当它看到非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 ** 鉴于Charles 3.8.3是:0000000001000b2f312f6f6e526573756c7400046e756c6c00000 ** 0b **

我知道如何解决这个问题,所以任何帮助都将不胜感激! 谢谢你的时间

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

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