1

バックグラウンドへ: 次のように、MYSQL データベースから byte[] の文字列を取得します。

s:12:"NUL*NUL_messages"; 

これをJavaで文字列に変換したい:

String str = new String(sd);

しかし、文字列には 10 文字しか含まれていません。

s:12:"*_messages"; 

ただし、次の解析が機能するには、12 文字が必要です。「NUL」バイトが削除されないように、誰かが私に何をすべきかを手伝ってもらえますか?

4

1 に答える 1

2

NULL文字列内の output は、コード ポイントがゼロの文字を表します。あなたの文字列はこれと同等です:

String s = "\0*\0_messages";

Java では\0印刷できません。ただし、文字列はそれを保持します-文字列の長さを確認すると、10 ではなく 12 ですが、文字列をコンソールに出力すると 10 文字しか出力されません。

System.err.println(s.length());
System.err.println(s);

版画(デモ

12
*_messages

コメント:これは、serialized-php-parser

このパーサーの問題は、そのparseStringメソッドの 156 行目で、出力される文字列の長さが構造内の文字数と一致することを期待しているs:<length>:ことです。宣言されているの<length>は 12 ですが、実際の長さは 10 しかないためparseString、175..176 行でストリームから余分な 2 文字を消費し、他のすべてを破壊します。

そのパーサーを'\0'使い続けたい場合は、文字列をエンコードする前に、アンダースコアなど、使用しない他の印刷可能な文字に文字を置き換え'\0'てから、解析の反対側に戻すことを検討してください。

于 2013-08-17T11:17:23.170 に答える