【问题标题】:How to convert an input of 3 octal numbers into CHMOD permissions into Binary?如何将 3 个八进制数的输入转换为 CHMOD 权限为二进制?
【发布时间】:2016-03-18 00:27:38
【问题描述】:

我正在尝试创建一个程序,该程序使用 3 个八进制数的命令行从用户那里获取输入,例如 5、2、6 或 5、2、6,并将它们转换为 3 组 3 位二进制数,像 101 010 110,并打印出相应的 CHMOD 权限,如 rx -w- rw-。

我在将这些数字与子字符串拼接成 3 个单独的数字 5 2 和 6 时遇到了很多麻烦。

我还需要程序将二进制数字集转换为 3 位数字和权限。并从权限分为数字和二进制。

这是我目前所拥有的:

import java.util.Scanner;
class Test {
        public static void main(String cheese[]){

            Scanner scan = new Scanner(System.in);

            String line1 = scan.nextLine();
            //String line2 = scan.nextLine();
            //String line3 = scan.nextLine();
            //String line4 = scan.nextLine();
            //String line5 = scan.nextLine();

            System.out.println(line12(line1));


        }

        public static String line12(String line){
            String ownerPermissions = "";
            String groupPermissions = "";
            String otherPermissions = "";

            int comma = 0;

            int lineLength = line.length();

            if (line.indexOf(" ") != -1){
                comma = line.indexOf(",");
            }else{
                comma = 1;
            }

            String firstNumber = line.substring(0, 1);

            line = line.substring(comma + 1, lineLength);

            int comma2 = line.indexOf(",");
            String secondNumber = line.substring(comma + 1, comma2);

            String thirdNumber = line.substring(lineLength);

            int firstInt= Integer.parseInt(firstNumber);
            int secondInt = Integer.parseInt(secondNumber);
            int thirdInt = Integer.parseInt(thirdNumber);

            String firstBinary = Integer.toBinaryString(firstInt);
            String secondBinary = Integer.toBinaryString(secondInt);
            String thirdBinary = Integer.toBinaryString(thirdInt);

            switch(firstInt){

                case 0:
                    ownerPermissions = "---";
                    break;
                case 1:
                    ownerPermissions = "--x";
                    break;
                case 2:
                    ownerPermissions = "-w-";
                    break;
                case 3:
                    ownerPermissions = "-wx";
                    break;
                case 4:
                    ownerPermissions = "r--";
                    break;
                case 5:
                    ownerPermissions = "r-x";
                    break;
                case 6:
                    ownerPermissions = "rw-";
                    break;
                case 7:
                    ownerPermissions = "rwx";
                    break;
            }

            switch(secondInt){

                case 0:
                    groupPermissions = "---";
                    break;
                case 1:
                    groupPermissions = "--x";
                    break;
                case 2:
                    groupPermissions = "-w-";
                    break;
                case 3:
                    groupPermissions = "-wx";
                    break;
                case 4:
                    groupPermissions = "r--";
                    break;
                case 5:
                    groupPermissions = "r-x";
                    break;
                case 6:
                    groupPermissions = "rw-";
                    break;
                case 7:
                    groupPermissions = "rwx";
                    break;
            }

            switch(thirdInt){

                case 0:
                    otherPermissions = "---";
                    break;
                case 1:
                    otherPermissions = "--x";
                    break;
                case 2:
                     otherPermissions = "-w-";
                    break;
                case 3:
                    otherPermissions = "-wx";
                    break;
                case 4:
                    otherPermissions = "r--";
                    break;
                case 5:
                    otherPermissions = "r-x";
                    break;
                case 6:
                    otherPermissions = "rw-";
                    break;
                case 7:
                    otherPermissions = "rwx";
                    break;
            }
            String output = firstBinary + " " + secondBinary + " " + thirdBinary + " and " + ownerPermissions + " " + groupPermissions + " " + otherPermissions;

            return output;
        }
}

【问题讨论】:

  • 问题是什么?
  • 顺便说一下这个错误在运行时弹出:线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-2
  • 用户输入的是什么?
  • 5、2、6 或不超过 7 的任何整数集,包括该格式中的 0

标签: java unix binary chmod octal


【解决方案1】:

如果您使您的代码更简单,您会发现它更容易。我建议像

public static void main(String[] args) {
    System.out.println(line12("5, 2, 6"));
}

public static String line12(String line) {
    String[] nums = line.trim().split(" *, *");
    StringBuilder sb = new StringBuilder();
    for (String s : nums) {
        if (sb.length() > 0) sb.append(" ");
        int num = Integer.parseInt(s);
        sb.append((num & 4) == 0 ? '-' : 'r');
        sb.append((num & 2) == 0 ? '-' : 'w');
        sb.append((num & 1) == 0 ? '-' : 'x');
    }
    return sb.toString();
}

打印

r-x -w- rw-

【讨论】:

  • 太棒了!
  • 但是 771 chmods 等呢?
  • @Acuna 您需要将正则表达式更改为split("")
猜你喜欢
  • 2015-09-15
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多