Преобразовать массив целых чисел (или строки) двоичных 1 и 0 в их альфа-эквивалент в Java - PullRequest
2 голосов
/ 20 марта 2019

У меня есть массив целых 1 и 0 (возможно, нужно преобразовать в byte тип?). Я использовал [онлайн ASCII для двоичного генератора] [1], чтобы получить эквивалентный двоичный файл из этой последовательности из 6 цифр:

abcdef должно быть равно 011000010110001001100011011001000110010101100110 в двоичном формате.

Мой массив настроен как int[] curCheckArr = new int[48];, и моя строка в основном просто использует StringBuilder для создания тех же самых строк, что и строки, и вызывает toString() - так что у меня есть доступ к коду в виде строки или массива .

Я пробовал несколько разных методов, каждый из которых вызывает сбой браузера, в том числе:

StringBuilder curCheckAlphaSB = new StringBuilder(); // Some place to store the chars

Arrays.stream( // Create a Stream
    curCheckString.split("(?<=\\G.{8})") // Splits the input string into 8-char-sections (Since a char has 8 bits = 1 byte)
).forEach(s -> // Go through each 8-char-section...
curCheckAlphaSB.append((char) Integer.parseInt(s, 2)) // ...and turn it into an int and then to a char
);

String curAlpha = curCheckAlphaSB.toString();

и

String curAlpha = "";

for (int b = 0; b < curCheckString.length()/8; b++) {

    int a = Integer.parseInt(curAlpha.substring(8*b,(b+1)*8),2);
    curAlpha += (char)(a);
}

Как наиболее эффективно преобразовать эти 48 1 и 0 в шестизначную последовательность букв?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Использование регулярных выражений, вероятно, самая медленная часть из них. Использование скомпилированного регулярного выражения поможет, но подстрока быстрее. Не создавать никаких строк, кроме результата будет быстрее. например используйте StringBuilder вместо += для String.

2 голосов
/ 20 марта 2019

Предполагая, что каждый символ представлен ровно одним byte, вы можете перебирать ввод с помощью Integer.parseInt() (поскольку значение byte на входе потенциально без знака):

String input = "011000010110001001100011011001000110010101100110";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < input.length(); i += 8) {
    int c = Integer.parseInt(input.substring(i, i + 8), 2);
    sb.append((char) c);
}
System.out.println(sb); // abcdef
...