2016-04-11 2 views
25

мне нужно, чтобы избежать следующей последовательности определяется как статические окончательногоСпасаясь нулевыми байтами рядом с двумя нулей

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 имеет восьмеричные литералы переменной длины. Каждый день я узнаю более странные вещи о языке. –

ответ

23

Используйте последовательность юникода побег:

"\u000000" 

Это символ NUL (\u0000), а затем два 0-х.

+3

Учитывая читабельность этого, я остался бы с '' \ 0 "+" 00 ", который всегда является константой времени компиляции, поэтому скомпилированный код будет идентичным. – Holger

21

У Darth Android есть решение, но вот причина, по которой ваши попытки не срабатывали так, как вы ожидали.

Причина, по которой нулевой символ представлен \0, не потому, что это специальная escape-последовательность только для нулевого символа; это потому, что это octal escape sequence of up to 3 octal digits.

Ваша строка "ustar\000" имеет 1 нулевой символ на конце, \000 и ваша строка "ustar\0\00" имеет 2 нулевых символов на конце, \0 и \00.

Решение, как уже упоминалось ранее Дарта Android - использовать Unicode escape, который имеет ровно 4 шестнадцатеричные цифры, так что дополнительные 0 персонажи только что - 0 символов. \u0000 - нулевой символ, а 5-й и 6-й 0 s - буква 0 символов.

15

Вы также можете использовать

"ustar\00000" 

\ может следовать до 3 восьмеричных цифр (от 000 и 377), так что это \000 следует "00".

В качестве альтернативы, вы можете сделать

"ustar\0\600" 

Это \0 следует \60 (восьмеричное для '0') с последующим '0'.