2

ByteArrayInputStream要素のコンテンツとして大きなbase64でエンコードされた文字列を持つ1つの要素で構成されるXMLドキュメントを含むを使用しています。テキストをデコードしてPDFドキュメントとして出力できるように、周囲のタグを削除する必要があります。

これを行うための最も効率的な方法は何ですか?

私のひざまずく反応は、ストリームをbyte配列に読み込み、開始タグの終わりを見つけ、終了タグの始まりを見つけてから、中央の部分を別のbyte配列にコピーすることです。しかし、これはかなり非効率的で、私が扱っているテキストは時々大きくなる可能性があります(128KB)。byte余分な配列なしでこれを行う方法が欲しいです。

4

2 に答える 2

2

<Base 64は文字を使用しないため>、Webセーフなbase64バリアントを使用していると想定しています。つまり、コンテンツ内のHTMLエンティティやコメントについて心配する必要はありません。コンテンツにこのフォームがあることが本当に確実な場合は、次の手順を実行します。

  1. 右からスキャンして。を探し'<'ます。これが終了タグの始まりになります。
  2. その位置から左にスキャンして、を探し'>'ます。これが開始タグの終わりになります。

Base 64のコンテンツは、これら2つの位置の間にあります。

を使用して2番目のアレイのサイズを事前設定できます

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

デコードされたコンテンツの長さの上限として、b64decodeします。これが機能するのは、base64の4桁ごとに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);
}

上記は私のWebブラウザーで作成されたものであるため、構文エラーが存在する可能性があります。

于 2012-03-15T20:02:33.623 に答える