2016-04-11 7 views
25

Ich brauche die folgende Sequenz als statisches Null-Byte neben zwei Nullen

final

final String POSIX_SIGNATURE = "ustar".concat("\0").concat("00"); 
definiert zu entkommen Wie würde ich dies entkommen, ohne die .concat() Methode noch den + String-Operators?

final String POSIX_SIGNATURE = "ustar\000"; 

Dies ist nicht gültig, nicht das gleiche wie das erste.

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

Dies ist auch keiner.

+0

Wie wäre es mit https://ideone.com/Tt28vf? –

+11

Als eine Randnotiz wird die String-Verkettung von Literalen während des Kompilierens durchgeführt, also gibt es wirklich keinen Grund, dass Sie nicht etwas wie '(" Stern "+" \ 0 "+" 00 ") verwenden können, wenn Sie denken, dass es ist klarer als die Lösungen ohne Verkettung. Siehe z.B. http://ideone.com/tkZneB. – Radiodef

+0

Große Frage. +1. Ich hatte keine Ahnung, dass Java Oktal-Char-Literale mit variabler Länge hatte. Jeden Tag lerne ich mehr seltsame Dinge über die Sprache. –

Antwort

23

eine Unicode-Escape-Sequenz verwenden:

"\u000000" 

Dies ist das NUL-Zeichen (\u0000), die von zwei 0'en gefolgt.

+3

In Anbetracht der Lesbarkeit von diesem, würde ich bleiben mit "" 0 "+" 00 "' das ist eine Kompilierzeit-Konstante sowieso, so dass der kompilierte Code identisch sein wird. – Holger

21

Darth Android hat die Lösung, aber hier ist der Grund, warum Ihre Versuche nicht so gelaufen sind, wie Sie es erwartet haben.

Der Grund, dass das Nullzeichen von \0 dargestellt wird, ist nicht, weil es eine spezielle Escape-Sequenz nur für das Nullzeichen ist; es ist, weil es ein octal escape sequence of up to 3 octal digits ist.

Ihre Zeichenfolge "ustar\000" haben 1 Null-Zeichen am Ende, \000, und die Zeichenfolge "ustar\0\00" haben zwei Null-Zeichen am Ende, \0 und \00.

Die Lösung, wie zuvor wird von Darth Android erwähnt - eine Unicode escape verwenden, die genau 4 hexadezimalen Ziffern hat, so dass zusätzliche 0 Zeichen genau das sind - 0 Zeichen. Die \u0000 ist das Nullzeichen, und die 5. und 6. 0 s sind wörtlich 0 Zeichen.

15

Sie können auch

verwenden
"ustar\00000" 

\ um bis zu 3 Oktalziffern folgen (zwischen 000 und 377), so wird dies \000 von "00" gefolgt.

Alternativ können Sie

"ustar\0\600" 

tun Dies ist \0 gefolgt von \60 (Oktal für '0'), gefolgt von '0'.