我有一个方法可以自动生成给定位数的所有可能性,另一种方法可以获取先前方法的输出并将其转换为格式化文本。
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
方法无法正常运行。由于某种原因,它没有返回格式化的字符串,我无法弄清楚为什么。难道我做错了什么?我该如何解决这个问题?