Подтвердить что ты не робот

Сброс нулевого байта рядом с двумя нулями

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

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

Как мне избежать этого без использования метода .concat() или оператора строки +?

final String POSIX_SIGNATURE = "ustar\000"; 

Это неверно, не то же самое, что и первое.

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

И это тоже.

4b9b3361

Ответ 1

Используйте escape-последовательность unicode:

"\u000000"

Это символ NUL (\u0000), за которым следуют два 0.

Ответ 2

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

Причина, по которой нулевой символ представляется \0, не потому, что это специальная escape-последовательность только для нулевого символа; потому что это восьмеричная escape-последовательность до 3-х восьмеричных цифр.

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

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

Ответ 3

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

"ustar\00000"

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

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

"ustar\0\600"

Это \0, за которым следует \60 (восьмеричный для '0'), за которым следует '0'.