Как вы «печатаете» массив байтов, который обрабатывает непечатаемые значения - PullRequest
0 голосов
/ 07 мая 2018

Я видел много похожих вопросов и ответов на этом форуме, но не нашел ничего, что решило бы мою проблему.

Идея достаточно проста:

(Это использует язык программирования Java - в настоящее время я ограничен использованием Java 7)

Получен массив байтов (представляющих что-либо: некоторый проводной формат, некоторую форму закодированных данных, двоичные данные со встроенным «текстом» и т. Д.). Я хотел бы иметь возможность печатать массив в следующих формах:

  1. в виде шестнадцатеричной строки
  2. как текст для печати

Первый случай отчасти по причинам отладки, но может также использоваться в режиме без отладки. Второй случай - исключительно по причинам отладки, и он позволяет сравнивать человека с другими источниками информации.

Мне кажется, у меня есть решение для первого случая, но я борюсь со вторым.

Очевидно, что массив байтов может содержать непечатаемые символы или символы, которые отображаются разными способами. Как я могу «напечатать» массив, чтобы все байты были представлены? Хороший аналог, который я могу предоставить, - это команда UNIX od, где od -ah отображает двоичные данные в шестнадцатеричной форме, а также символы ASCII. В этом случае точки (.) обычно используются вместо непечатных или управляющих символов.

Мне не нужно, чтобы он точно выглядел как то, что выдает od, но хотел бы иметь возможность показывать данные так, чтобы по крайней мере печатные символы были видны, а остальные отображались с каким-то заполнителем. Кроме того, я не хочу удалять непечатаемые символы, поскольку это может привести к неверному представлению данных.

Если у кого-то есть информация о том, как этого добиться, я был бы очень признателен.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Хмм, у тебя Arrays.toString() работает?

public class PrintBytes {
   public static void main( String[] args ) {
      byte[] test = { 1, 2, 3, 0, (byte)0xFF, (byte)0xFE };
      String s = Arrays.toString( test );
      System.out.println( s );

   }
}

Выход:

run:
[1, 2, 3, 0, -1, -2]
BUILD SUCCESSFUL (total time: 0 seconds)

Это не шестнадцатеричный формат, но пригодный для использования проводной формат.

0 голосов
/ 07 мая 2018

Попробуйте это для # 2:

String original = new String(bytes);
String printable = original.replaceAll("\\P{Print}", ".")); //Or any other character instead of "." you want

Используется класс печати POSIX .

Если вам нужна поддержка Unicode, создайте строку с аргументом набора символов utf-8, создайте шаблон с флагом UNICODE_CHARACTER_CLASS и используйте то же регулярное выражение, что и выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...