Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Написать калькулятор прав chmod (http://forum.oszone.net/showthread.php?t=327605)

blackeangel 14-06-2017 22:27 2744644

Написать калькулятор прав chmod
 
Собственно у меня только один вопрос:
Как считать текст?
То есть мы имеем
r=4
w=2
x=1
А вот есть -rwxr-xr-x, которому соответствует 755.
Получается надо читать посимвольно со второго знака куда то, при этом сравнивая с этими условиями и писать куда-то как числа, переводя строки в числа, потом складывать и снова писать в текст?

Iska 14-06-2017 23:11 2744650

Цитата:

Цитата blackeangel
А вот есть -rwxr-xr-x »

Вы не путаете? Пишут, что есть «rwxr-xr-x», но не «-rwxr-xr-x». То есть группа «rwx» — «владелец», группа «r-x» — «группа» и группа «r-x» — «остальные».

Цитата:

Цитата blackeangel
есть -rwxr-xr-x, которому соответствует 755.
Получается надо читать посимвольно со второго знака куда то, при этом сравнивая с этими условиями и писать куда-то как числа, переводя строки в числа, потом складывать и снова писать в текст? »

Читать надо регуляркой, разбивая на группы по три символа и одновременно проверяя на допустимость символов, например:
Код:

([r\-][w\-][x\-])([r\-][w\-][x\-])([r\-][w\-][x\-])
Затем каждую группу из найденного соответствия переводите в двоичный вид по принципу:
  • на позиции 2 символ «-» — значит это будет «0», иначе — «1»;
  • на позиции 1 символ «-» — значит это будет «0», иначе — «1»;
  • на позиции 0 символ «-» — значит это будет «0», иначе — «1».
Для указанного выражения получаем для групп:
  • двоичное 111, т.е. 1·2² + 1·2¹ + 1·2° = 4 + 2 + 1 = 7;
  • двоичное 101, т.е. 1·2² + 0·2¹ + 1·2° = 4 + 0 + 1 = 5;
  • двоичное 101, т.е. 1·2² + 0·2¹ + 1·2° = 4 + 0 + 1 = 5.
Обратное преобразование будет куда проще.

Как это лучше всего будет оформить-реализовать в Java, я Вам, разумеется, не подскажу.

blackeangel 14-06-2017 23:23 2744654

Цитата:

Цитата Iska
Вы не путаете? Пишут, что есть «rwxr-xr-x», но не «-rwxr-xr-x». То есть группа «rwx» — «владелец», группа «r-x» — «группа» и группа «r-x» — «остальные». »

Нет, не путаю. Первый символ может быть:
d - для папок;
l - для ссылок.
То есть для папки с разрешениями 755 это будет выглядеть следующим образом: drwxr-xr-x.

регулярка это мысль.
Но думаю разбить на 3 группы: с 2го по 4й символ, с 5 по 7 символ, с 8 по 10 символ через substring и закинуть в один цикл хождения по символам сразу трех групп.

Iska 14-06-2017 23:46 2744659

Цитата:

Цитата blackeangel
Нет, не путаю. Первый символ может быть: »

Тогда поправьте шаблон регулярки в правильном направлении.

Цитата:

Цитата blackeangel
Но думаю разбить на 3 группы: с 2го по 4й символ, с 5 по 7 символ, с 8 по 10 символ через substring и закинуть в один цикл хождения по символам сразу трех групп. »

Регуляркой будет а) проще и б) Вы сразу, ей же, сделаете проверку на допустимые символы.

shisik 14-06-2017 23:48 2744661

Цитата:

Цитата blackeangel
Но думаю разбить на 3 группы: с 2го по 4й символ, с 5 по 7 символ, с 8 по 10 символ через substring и закинуть в один цикл хождения по символам сразу трех групп. »

Регэксп это уже сделает за вас. По крайней мере на 3 группы разбивает.

Цитата:

Цитата blackeangel
Нет, не путаю. Первый символ может быть:
d - для папок;
l - для ссылок. »

Ну так добавьте ещё ([bcdlps-]) в начало - будет вам флаг типа.

blackeangel 14-06-2017 23:51 2744663

Iska, думаю как то так:
Код:

^.*([r\\-][w\\-][x\\-])([r\\-][w\\-][x\\-])([r\\-][w\\-][x\\-])$
(Регулярки на java и vb очень похожи)

shisik 14-06-2017 23:53 2744664

Цитата:

Цитата blackeangel
.* »

Не думаю, что эт охорошая мысль. Допустимые символы там тоже строго регламентированы, так что лучше ([bcdlps-]). Ну или [bcdlps-] если флаг не нужен.

blackeangel 15-06-2017 00:09 2744667

shisik, есть уже готовое решение на другом форуме.
Код:

private static String getDigits(String s) {
        if (!s.matches(".*([r-][w-][x-]){3}$")) {
            throw new IllegalArgumentException("Achtung!");
        }
        Function<String, String> rwxMapper = rwx -> String.valueOf(Integer.parseInt(rwx.replaceAll("[rwx]", "1").replaceAll("-", "0"), 2));
        return Arrays.stream(s.substring(s.length() - 9).split("(?<=\\G...)")).map(rwxMapper).collect(joining());
    }

Но всегда должно быть альтернативное решение.
И, очень важно, понять что же там происходит.


Время: 18:08.

Время: 18:08.
© OSzone.net 2001-