我试图写一个程序,可以从网页响应读取不同类型的编码。现在我正试图弄清楚如何成功地读取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**而Charles 3.8.3为:0000000001000b2f312f6f6e526573756c7400046e756c6c00000**0b**
我对如何解决这个问题束手无策,所以任何帮助都会非常感激!感谢您的宝贵时间
看起来您正在使用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.
您的代码假设每个流都使用UTF-8编码。这是完全错误的。您需要检查内容类型的响应头字段。