【问题标题】:How can I read octet-stream to plain string/text by using java?如何使用 java 将八位字节流读取为纯字符串/文本?
【发布时间】:2020-02-13 18:22:05
【问题描述】:

我有一些来自 byte[] 的内容,它代表保存到 .txt 文件的请求中的数据。

try {
        while ((bytesRead = streamFromClient.read(currentRequest)) != -1) {

                LOG.info("Received request...");
                addInvoiceRequestOnly();
                streamToServer.write(currentRequest, 0, bytesRead);
                streamToServer.flush();
                dumpTrafficToFile();
            }

        } catch (IOException e) {
            LOG.severe("Could not read/write from/to the request...");
            e.getStackTrace();
        }
POST /domibus/services/...
Host: domibusbackend
Connection: close
Content-Length: 16189
Content-Type: multipart/related; type="application/soap+xml"; boundary="uuid:6b5b42a6-ea2f-4830-84c3-c799f38ca32a"; start="<root.message@cxf.apache.org>"; start-info="application/soap+xml"
Accept: */*
User-Agent: Apache-CXF/3.3.2
Cache-Control: no-cache
Pragma: no-cache
.........
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-ID: <53c6399c-a6b1-4ffa-9c85-d8b7bb337f28@www.someDomain.com>
CompressionType: application/gzip
MimeType: application/xml

­†’^tÜ:–jq®Z{€Üş˝`cWłÓx˘ěxĐWé"v«8-ňBStÂá›Ë+•jnCćcv‰v2—ťř‘÷ż÷ ĺůéűI˝sJá@Vzľ¸…“ߟ¤Ž2]§yÁbů,m ĺgٱťŠ¸áĐĽ<í.ÖÚeGü®î…Č>
-b¶öG BD,[âŤţ*^lJĘ@DLŃ%Ó:°Ě¸ÉÇVťäś(ăÉÁSy¨±ă“˙řµÁ¨žńˇęÁŽ‚GyvSĄ Ąeě$EI‡*0ĎEĽ•(Ú/{ôđ:d?ćŢ6Agަ ?ý+𣔣bÁË:˛×í„EQT·
ł/0Ž!ÂŚ6öpqÚ[Q˛ä–ů'0]
ŢfĎgÓŤß7ü–ඤşÔř»?É€“}%ů†Z/€ęŃ·b÷ĂR
żŇ’!|…q· FÉ2ľÎöDÎ>ÖËY)hşk’
łÍĚäŕ„ę+
ă6ţwÇäŘöpŻŞŁ¬tµŢp&ŁK?„8îIč™U\Ä_j)Q“˝QI·čOŽ|ż/Żl±MÁŔµ¤·c{ëŇś¸űXďß%yň¤¨CŇ1ÂĎVÜÝÁwăł[Ť
ťÔ‹Ń(µ[
p]r1Żq{0Ů7ęŐGGżX"˘ćŇÇgj*TRĽĺ*Ă@@ŐÖKąĐ•ľe7­ąWöVĺ:çĂŢnHöT}ł•ť!dĂô¬ZTz'ÝS.¤öX×čÜť9ܰ™ô-Ue#xÚ–LL‡
í
‹Uĺ×Tśü«$tĚ

谁能告诉我如何将这些数据转换为人类可读的数据? 它在标题中说它应该是二进制的,但事实并非如此,二进制数据看起来不同。我从请求中得到了很多可读的数据,但最后一部分,你看到的是外星东西,我不知道如何解码它...... 如果有人可以帮助我,我将不胜感激。 谢谢!

【问题讨论】:

  • 这个请求在我看来格式不正确。 MimeType 不是标准标头,它似乎与应该是 application/xml(或 text/xml)的 Content-Type 冲突。没有Content-Length 标头似乎也很奇怪;没有它,就无法验证消息是否完整。
  • “二进制数据看起来不一样”——怎么回事?这不正是当您的文本编辑器试图将二进制数据解释为文本时发生的情况吗?
  • 你可以尝试使用 MimeUtility.decode()
  • @dnault 我没有显示请求中的所有内容;我也添加了标题
  • 感谢您更新您的问题。看起来您可能正在尝试从头开始实现 SOAP 服务器。相反,您可以考虑使用现有框架之一(谷歌“java soap server”)。

标签: java gzip binaryfiles gzipinputstream


【解决方案1】:

这建议压缩:CompressionType: application/gzip

所以将正文输入java.util.zip.GZIPInputStream

【讨论】:

  • 它抛出 ZipException - 不是 zip 格式...我尝试了不同的方式来读取那些表示将被 gzip 压缩但使用 GZIPInputStream 不是解决方案的编码数据...
【解决方案2】:

我假设您使用的是Servlet-API,如果您使用的是任何框架,您需要修改第一个代码 sn-p 以提取请求正文并将其传递给extract()

public void doPost(HttpServletRequest request, HttpServletResponse response) {
    InflaterInputStream is = InflaterInputStream(request.getInputStream()); 
    String readableString = extract(is);
    // do the processing
}

然后将压缩后的二进制数据转换成可读的字符串

private String extract(InputStream is) throws IOException {
    StringBuffer sb = new StringBuffer();
    BufferedReader in = new BufferedReader(new InputStreamReader(is));
    String inputLine = "";
    while ((inputLine = in.readLine()) != null) {
        sb.append(inputLine);
    }
    return sb.toString();
}

【讨论】:

  • 不,我没有使用它,我正在接受来自字节[]的请求
  • 什么是currentRequest
  • currentRequest 是一个字节数组 byte[] ...byte[] 保存请求中的数据
猜你喜欢
  • 2015-09-16
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多