2016-04-11 5 views
25

の隣にNULLバイトをエスケープのstatic finalと私は定義された次のシーケンスをエスケープする必要がある2つのゼロ

final String POSIX_SIGNATURE = "ustar".concat("\0").concat("00"); 

にはどうすれば.concat()方法も+文字列演算子を使用せずにこれを逃れるでしょうか?

final String POSIX_SIGNATURE = "ustar\000"; 

これは有効ではなく、最初のものと同じではありません。

final String POSIX_SIGNATURE = "ustar\0\00"; 

これもどちらでもありません。

+0

https://ideone.com/Tt28vfではどうですか? –

+11

補足として、リテラルの 'String'連結はコンパイル時に行われるので、'( "ustar" + "\ 0" + "00") 'のようなものは使用できません。連結なしのソリューションよりも明確です。例えば、 http://ideone.com/tkZneB。 – Radiodef

+0

大きな質問です。 +1。私は、javaが可変長の8進数のcharリテラルを持っているかどうかは分かりませんでした。毎日私は言語についてもっと奇妙なことを学びます。 –

答えて

23

は、Unicodeエスケープシーケンスを使用します。

"\u000000" 

これは、2つの0の続くNUL文字(\u0000)、です。

+3

この読みやすさを考慮すると、コンパイル時の定数である '" \ 0 "+" 00 "'ととどまるので、コンパイルされたコードは同じになります。 – Holger

21

ダース・アンドロイドが解決策を示しましたが、あなたの試行があなたの期待通りに機能しなかった理由がここにあります。

ヌル文字が\0で表される理由は、ヌル文字だけの特別なエスケープシーケンスであるためではありません。それはoctal escape sequence of up to 3 octal digitsだからです。

あなたの文字列"ustar\000"は終わり、\000に1つのヌル文字を持っており、あなたの文字列"ustar\0\00"は最後の2つのヌル文字、\0\00を持っています。

ソリューションは、先ダース・アンドロイドで言及されている - 0文字 - 余分な0文字がまさにそれであるように、正確に4桁の16進数があるUnicode escapeを、使用しています。 \u0000はヌル文字で、第5および第6の0はリテラル0文字です。あなたはまた、

"ustar\00000" 

\を使用することができます

15

は(000377間)までの3桁の8進数を続けることができますので、これは"00"続く\000です。

また、あなたはこれが'0'続い\60'0'用オクタル)に続い\0ある

"ustar\0\600" 

行うことができます。

関連する問題