2

パケットキャプチャ中に記録されたイベントを再生するコードジェネレータを作成しています。

JVMはかなり制限されています-結局のところ。メソッドのサイズは64KBを超えることはできません。そこで、コードジェネレーターでJavaメソッドを分割するために、あらゆる種類のトリックを追加しました。

しかし今、私は新しい問題を抱えています。私はいくつかのbyte[]配列を取得し、それらをクラス内の静的変数にしました。例:

public class myclass {
    private static byte[] byteArray = { 0x3c, 0x3f, ...
        ...
    };
    private static byte[] byteArray2 = { 0x1a, 0x20, ...
        ...
    };

    ...

    private static byte[] byteArray_n = { 0x0a, 0x0d, ...
        ...
    };        
}

「静的初期化子のコードが65535バイトの制限を超えています」というエラーが表示されます。

外部ファイルを持ってそこからデータを読みたくありません。単一のファイルで生成されたコードを使用したい。

私に何ができる?クラスの外で配列を宣言できますか?または、値128〜255にUnicodeの文字列を使用する必要がありますか(たとえば、(byte)0x9cの代わりに\ u009c)?それとも、静的に初期化されたデータを使用したいのは、現在世界で私だけですか?

アップデート

私が現在使用している手法は、次のような関数の自動作成です。

private byte[] byteArray_6() {
  String localString = "\u00ff\u00d8\u00ff\u00e0\u0000\u0010JFIF\u0000" +
    "(0%()(\u00ff\u00db\u0000C\u0001\u0007\u0007\u0007\n\u0008\n\u0013\n" +
    "\u0000\u00b5\u0010\u0000\u0002\u0001\u0003\u0003\u0002\u0004\u0003";
  byte[] localBuff = new byte[ localString.length() ];
  for ( int localInt = 0; localInt < localString.length(); localInt++ ) {
    localBuff[localInt] = (byte)localString.charAt(localInt);
  }
  return localBuff;
}

注:Javaは驚くべきことを続けています。0〜255の範囲のすべての値を\ u00XX(XXは2文字の16進表現)としてエンコードできると思います。しかし、あなたは間違っているでしょう。Javaコンパイラは、実際には\u000Aをコード内のリテラル「\n」と見なします。これにより、ソースコードのコンパイルが中断されます。したがって、文字列にはUnicodeエスケープを使用できますが、\u000aと\u000dの代わりにそれぞれ「\n」と「\r」を使用する必要があります。また、6文字のUnicodeエスケープ表現の代わりに、文字列に印刷可能な文字を入れても問題ありません。

4

3 に答える 3

4

一般に、データをリテラルに入れてStringから、それを にデコードするメソッドを用意しbyte[]ます。toByteArray()UTF-8 では可能なすべてのバイト シーケンスが生成されず、一部の値はまったく表示されないため、使用が制限されます。

この手法は、小さなオブジェクト コードを生成しようとする場合に非常によく使用されます。配列の初期化コードの膨大なシーケンスを削除すると、起動時間も短縮されます。

私の頭の上から:

public static byte[] toBytes(String str) {
    char[] src = str.toCharArray();
    int len = src.length;
    byte[] buff = new byte[len];
    for (int i=0; i<len; ++i) {
        buff[i] = (byte)src[i];
    }
    return buff;
}

よりコンパクトなスキームが利用可能です。たとえば、文字列の文字の内容を [1, 127] に制限することができます (0 は非常に悪い理由で正規化されていない形式でエンコードされます)。またはもっと複雑な何か。JDK8 には Base64 デコード用のパブリック API が用意されると思いますが、これはそれほど悪くなく、適切に標準化されています。

于 2012-11-22T10:23:24.097 に答える
0

配列リストを宣言し、静的コンストラクターを使用する

于 2012-11-22T10:47:17.277 に答える
0

ネストされたクラスを使用して静的配列を格納できる場合があります。このステップは実行者にとって最善の方法ではありませんが、コードの変更を最小限に抑えることができると思います。

于 2013-12-19T10:41:08.460 に答える