二进制序列器方法不起作用

时间:2015-08-27 15:43:31

标签: java regex string recursion binary

我有一个方法可以自动生成给定位数的所有可能性,另一种方法可以获取先前方法的输出并将其转换为格式化文本。

代码:

public static String bytePossibalitiyGenerator(int numBits) throws Exception {
        String toBeReturned = "";
        for (String s : bg(numBits, "")) {
            toBeReturned += s + "\t";
        }

        //TODO Debug lines, remove eventually
        System.out.println("All of the possible combinations for " + numBits / 8 + " byte(s):");
        System.out.println(toBeReturned);

        return toBeReturned;
    }

    private static ArrayList<String> bg(int bits, String current) throws Exception {
        ArrayList<String> binaries = new ArrayList<>();
        if (bits%8 != 0) {
            int crash = bits%8;
            throw new Exception("The bit count that you have entered is not divisable by 8:" + "\t" + "There is a remainder of: " + Integer.toString(crash));
        } else {
            if (current.length() == bits) {
                binaries.add(current);
                return binaries;
            }
            // pad a 0 and 1 in front of current;
            binaries.addAll(bg(bits, "0" + current));
            binaries.addAll(bg(bits, "1" + current));

            //TODO Debug line(s), remove eventually
            System.out.println(binaries.toString());
        }
        return binaries;
    }

    // The method below is supposed to format out the whitespace between binary strings and arrange the
    // data in such a way that each possible outcome is on a new line.
    //TODO Eventually implement the output to a file instead of just console    
    public static String binarySequencer(String input, int byteLength) throws Exception {
        StringBuilder toReturn = new StringBuilder();
        // This StringBuilder is a safety precaution to ensure that if the algorithm is to be
        // run again, the value of each previously read and appended string
        // position is nullified so that it is not re-appended to the StringBuffer
        StringBuilder inputSB = new StringBuilder(input);

        //To ensure that the input is binary
        boolean stringBinary = Pattern.compile("^[0-1\\t]+$").matcher(input).find();

        // This boolean is to check whether the loop has previously passed over x amount byte(s) for sequencing
        boolean hasPassedByteStringLength = false;

        int prevoiusRunLength = 0;

        //Safety if statement, to ensure that the input is directly from the binary generator method
        if (stringBinary == false) {
            System.out.println(stringBinary);
            System.out.println(input);
            // TODO Find a way to print the stack trace...
            throw new Exception();
        }
        int runLength = 0;
        for (int i = 0; i < inputSB.length(); i++) {
            int j = 0;
            if (runLength == 8 && (inputSB.charAt(j += i) == 0 || inputSB.charAt(j += i) == 1)) {
                toReturn.append(Character.toString(' '));
                runLength = 0;
                if ((prevoiusRunLength += runLength) != byteLength) {
                    hasPassedByteStringLength = false;
                } else {
                    hasPassedByteStringLength = true;
                }
            } else {
                if (hasPassedByteStringLength = true && runLength == 8 && (inputSB.charAt(j) != 0 || inputSB.charAt(j) != 1)) {
                    toReturn.append("\n");
                    runLength = 0;
                    prevoiusRunLength = 0;
                    hasPassedByteStringLength = false;
                }
                while (i + 1 < inputSB.length() && (inputSB.charAt(i) == 0 || inputSB.charAt(i) == 1) && runLength != 8) {
                    runLength++;
                    toReturn.append(inputSB.charAt(i));
                    inputSB.insert(i, (char[]) null);
                    i++;

                    //TODO Debug lines, remove eventually
                    System.out.println(toReturn);
                }
            }
        }
        return toReturn.toString();
    }

    public static void main(String[] args) throws Exception {
        int bitCount = 8;
        System.out.println(binarySequencer(bytePossibalitiyGenerator(bitCount), bitCount));
    }

生成器方法的输出:

[00000000, 10000000, 01000000, 11000000, 00100000, 10100000, 01100000, 11100000, 00010000, 10010000, 01010000, 11010000, 00110000, 10110000, 01110000, 11110000, 00001000, 10001000, 01001000, 11001000, 00101000, 10101000, 01101000, 11101000, 00011000, 10011000, 01011000, 11011000, 00111000, 10111000, 01111000, 11111000, 00000100, 10000100, 01000100, 11000100, 00100100, 10100100, 01100100, 11100100, 00010100, 10010100, 01010100, 11010100, 00110100, 10110100, 01110100, 11110100, 00001100, 10001100, 01001100, 11001100, 00101100, 10101100, 01101100, 11101100, 00011100, 10011100, 01011100, 11011100, 00111100, 10111100, 01111100, 11111100, 00000010, 10000010, 01000010, 11000010, 00100010, 10100010, 01100010, 11100010, 00010010, 10010010, 01010010, 11010010, 00110010, 10110010, 01110010, 11110010, 00001010, 10001010, 01001010, 11001010, 00101010, 10101010, 01101010, 11101010, 00011010, 10011010, 01011010, 11011010, 00111010, 10111010, 01111010, 11111010, 00000110, 10000110, 01000110, 11000110, 00100110, 10100110, 01100110, 11100110, 00010110, 10010110, 01010110, 11010110, 00110110, 10110110, 01110110, 11110110, 00001110, 10001110, 01001110, 11001110, 00101110, 10101110, 01101110, 11101110, 00011110, 10011110, 01011110, 11011110, 00111110, 10111110, 01111110, 11111110, 00000001, 10000001, 01000001, 11000001, 00100001, 10100001, 01100001, 11100001, 00010001, 10010001, 01010001, 11010001, 00110001, 10110001, 01110001, 11110001, 00001001, 10001001, 01001001, 11001001, 00101001, 10101001, 01101001, 11101001, 00011001, 10011001, 01011001, 11011001, 00111001, 10111001, 01111001, 11111001, 00000101, 10000101, 01000101, 11000101, 00100101, 10100101, 01100101, 11100101, 00010101, 10010101, 01010101, 11010101, 00110101, 10110101, 01110101, 11110101, 00001101, 10001101, 01001101, 11001101, 00101101, 10101101, 01101101, 11101101, 00011101, 10011101, 01011101, 11011101, 00111101, 10111101, 01111101, 11111101, 00000011, 10000011, 01000011, 11000011, 00100011, 10100011, 01100011, 11100011, 00010011, 10010011, 01010011, 11010011, 00110011, 10110011, 01110011, 11110011, 00001011, 10001011, 01001011, 11001011, 00101011, 10101011, 01101011, 11101011, 00011011, 10011011, 01011011, 11011011, 00111011, 10111011, 01111011, 11111011, 00000111, 10000111, 01000111, 11000111, 00100111, 10100111, 01100111, 11100111, 00010111, 10010111, 01010111, 11010111, 00110111, 10110111, 01110111, 11110111, 00001111, 10001111, 01001111, 11001111, 00101111, 10101111, 01101111, 11101111, 00011111, 10011111, 01011111, 11011111, 00111111, 10111111, 01111111, 11111111]

将生成器输出转换为字符串的方法的输出:

All of the possible combinations for 1 byte(s):
00000000    10000000    01000000    11000000    00100000    10100000    01100000    11100000    00010000    10010000    01010000    11010000    00110000    10110000    01110000    11110000    00001000    10001000    01001000    11001000    00101000    10101000    01101000    11101000    00011000    10011000    01011000    11011000    00111000    10111000    01111000    11111000    00000100    10000100    01000100    11000100    00100100    10100100    01100100    11100100    00010100    10010100    01010100    11010100    00110100    10110100    01110100    11110100    00001100    10001100    01001100    11001100    00101100    10101100    01101100    11101100    00011100    10011100    01011100    11011100    00111100    10111100    01111100    11111100    00000010    10000010    01000010    11000010    00100010    10100010    01100010    11100010    00010010    10010010    01010010    11010010    00110010    10110010    01110010    11110010    00001010    10001010    01001010    11001010    00101010    10101010    01101010    11101010    00011010    10011010    01011010    11011010    00111010    10111010    01111010    11111010    00000110    10000110    01000110    11000110    00100110    10100110    01100110    11100110    00010110    10010110    01010110    11010110    00110110    10110110    01110110    11110110    00001110    10001110    01001110    11001110    00101110    10101110    01101110    11101110    00011110    10011110    01011110    11011110    00111110    10111110    01111110    11111110    00000001    10000001    01000001    11000001    00100001    10100001    01100001    11100001    00010001    10010001    01010001    11010001    00110001    10110001    01110001    11110001    00001001    10001001    01001001    11001001    00101001    10101001    01101001    11101001    00011001    10011001    01011001    11011001    00111001    10111001    01111001    11111001    00000101    10000101    01000101    11000101    00100101    10100101    01100101    11100101    00010101    10010101    01010101    11010101    00110101    10110101    01110101    11110101    00001101    10001101    01001101    11001101    00101101    10101101    01101101    11101101    00011101    10011101    01011101    11011101    00111101    10111101    01111101    11111101    00000011    10000011    01000011    11000011    00100011    10100011    01100011    11100011    00010011    10010011    01010011    11010011    00110011    10110011    01110011    11110011    00001011    10001011    01001011    11001011    00101011    10101011    01101011    11101011    00011011    10011011    01011011    11011011    00111011    10111011    01111011    11111011    00000111    10000111    01000111    11000111    00100111    10100111    01100111    11100111    00010111    10010111    01010111    11010111    00110111    10110111    01110111    11110111    00001111    10001111    01001111    11001111    00101111    10101111    01101111    11101111    00011111    10011111    01011111    11011111    00111111    10111111    01111111    11111111    

来自音序器方法的所需输出:

我希望输出的排列方式使每个可能性都在新的一行上。例如,如果我想生成2个字节(16位)的所有可能性,那么我希望代码排列如下:

00000000 00000001
00000000 00000010
00000000 00000011

等等......

问题

二进制生成器和将其转换为String并返回它的方法,两者都可以正常工作。但是,binarySequencer方法无法正常运行。由于某种原因,它没有返回格式化的字符串,我无法弄清楚为什么。难道我做错了什么?我该如何解决这个问题?

0 个答案:

没有答案