2

我正在使用ByteArrayInputStream包含一个 XML 文档的 XML 文档,该文档由一个元素组成,其中一个大的 base 64 编码字符串作为元素的内容。我需要删除周围的标签,以便我可以解码文本并将其输出为 pdf 文档。

最有效的方法是什么?

我的下意识反应是将流读入一个byte数组,找到开始标签的结尾,找到结束标签的开头,然后将中间部分复制到另一个byte数组中;但这似乎效率很低,而且我正在使用的文本有时会很大(128KB)。我想要一种没有额外byte数组的方法。

4

2 回答 2

2

Base 64 不使用字符<>所以我假设您使用的是网络安全的 base64 变体,这意味着您无需担心内容中的 HTML 实体或注释。如果您确实确定内容具有这种形式,请执行以下操作:

  1. 从右侧扫描寻找'<'. 这将是关闭标签的开始。
  2. 从该位置向左扫描以查找'>'. 这将是开始标签的结尾。

base 64 内容在这两个位置之间,排他性的。

您可以使用

((end - start + 3) / 4) * 3

作为解码内容长度的上限,然后将 b64decode 放入其中。这是因为每 4 个 base64 数字编码 3 个字节。

如果您想要真正花哨,因为您知道数组的前几个字节包含可忽略的标记数据并且编码数据小于输入,您可以破坏性地解码当前字节缓冲区中的数据。

于 2012-03-15T19:39:14.760 回答
0

在阅读流媒体时进行搜索和转换。

// find the start tag
byte[] startTag = new byte[]{'<', 't', 'a', 'g', '>'};
int fnd = 0;
int tmp = 0;
while((tmp = stream.read()) != -1) {
 if(tmp == startTag[fnd]) 
  fnd++;
 else
  fnd=0;
 if(fnd == startTage.size()) break;
}

// get base64 bytes
while(true) {
 int a = stream.read();
 int b = stream.read();
 int c = stream.read();
 int d = stream.read();
 byte o1,o2,o3; // output bytes
 if(a == -1 || a == '<') break;
 //
 ...
 outputStream.write(o1);
 outputStream.write(o2);
 outputStream.write(o3);
}

注意以上是在我的浏览器中编写的,因此可能存在语法错误。

于 2012-03-15T20:02:33.623 回答