在我的程序中,我有一个创建PNG图像的Web应用程序。此PNG图像将写入文件并在请求中返回。当我将请求写入文件时,它与最初写入硬盘驱动器的文件应该完全相同时不同。响应中的PNG只是一个空白图像。 (我猜它是腐败的。)
我使用二进制diff程序来区分两个PNG文件,发现响应PNG中的一些字符只是用十六进制值3F而不是它们的实际值替换。
这是差异的图像: Diff Image
似乎响应是将一些HEX值变为3F,为什么会这样?有没有办法让它停止这样做。
为了更具体地说明如何创建响应,使用FileRepresentation(来自RESTlet)获取PNG文件并将其放入响应中。我使用RESTlet文件类型MEDIATYPE_PNG。
答案 0 :(得分:4)
我在这里看到的模式是,在所有情况下,更改的源图像字节都是ASCII不可显示的,并且似乎已被3F替换,这是一个ASCII'?',一个用于替换不可显示字符的常用字符。 / p>
答案 1 :(得分:2)
正如karmakaze所说,似乎有人正在搞乱编码,将其解释为文本文件并用“?”替换“禁止”字符。焦炭。具体地,“校正”的点不仅对应于非ascii点,而且对应于Win-1252编码(81,8D,8F,90和9D)中的(少数)未使用的字符。一切都指向某人将二进制内容解释为文本,可能在某些Windows环境中。
答案 2 :(得分:1)
我发现了这个问题。我以错误的方式访问响应。通过使用response.getEntity.getText(),它不提供准确的字符串表示,因为文件中的某些值不是ascii范围的一部分。它取代了“?”那些不在ascii范围内的值。
所以我只是通过使用response.getEntity()。getStream()得到一个字节流,一切正常。
全部谢谢!