Отделение текста ASCII от двоичного содержимого в файле - PullRequest
2 голосов
/ 12 февраля 2010

У меня есть файл, содержащий текст ASCII и двоичное содержимое. Я хотел бы извлечь текст без разбора двоичного содержимого, так как двоичное содержимое составляет 180 МБ. Могу ли я просто извлечь текст для дальнейших манипуляций ... что было бы лучшим способом сделать это.

ASCII находится в самом начале файла.

Ответы [ 6 ]

3 голосов
/ 12 февраля 2010

Существует 4 библиотеки для чтения файлов FITS на Java здесь :

Java

nom.tam.fits классы

Была разработана библиотека Java FITS, которая обеспечивает эффективный - по крайней мере для Java - ввод / вывод для изображений FITS и двоичных таблиц. Библиотеки Java поддерживают все основные форматы FITS и сжатые файлы gzip. Поддержка доступа к подмножествам данных включена, и может использоваться соглашение HIERARCH.

eap.fits

Включает апплет и приложение для просмотра и редактирования файлов FITS. Также включает в себя пакет общего назначения для чтения и записи данных FITS. Он может читать зашифрованные файлы PGP, если доступен дополнительный файл jar PGP.

jfits

Библиотека jfits поддерживает изображения FITS, ASCII и двоичные таблицы. Встроенная модификация ключевых слов и данных поддерживается.

СТИЛ

Чистая библиотека ввода-вывода Java общего назначения, которая может читать и записывать двоичные таблицы FITS среди других форматов таблиц. Он эффективен и может обеспечить быстрый последовательный или произвольный доступ для чтения к таблицам FITS, значительно превышающим физическую память. Не поддерживается изображение FITS.

1 голос
/ 12 февраля 2010

Первые 2880 байтов файла FITS являются данными заголовка ASCII, представляющими 36 80 столбцов "изображения карт". Здесь нет символов конца строки, только массив ASCII размером 36x80, дополненный пробелами при необходимости. Могут быть дополнительные 2880-байтовые заголовки ASCII, предшествующие двоичным данным; вам нужно проанализировать первый набор заголовков, чтобы узнать, сколько ASCII ожидать.

Но я от всей души одобряю совет Оскара Рейеса использовать существующий пакет для декодирования файлов FITS! Два из упомянутых им пакетов размещены в Центре космических полетов имени Годдарда, который также отвечает за поддержание формата FITS. Это примерно такой же источник, как вы можете получить.

1 голос
/ 12 февраля 2010

Есть метод, который проверяет, соответствует ли конкретный символ вашим критериям (здесь я рассмотрел символы, которые находятся на клавиатуре). Как только вы нажимаете на символ, для которого метод возвращает false, вы знаете, что попали в двоичный файл. Обратите внимание, что действительные символы ASCII также могут составлять часть двоичного кода, поэтому в конце вы можете получить несколько дополнительных символов.

static boolean isAsciiCharacter(char c) {
    return (c >= ' ' && c <= '~') ||
            c == '\n' ||
            c == '\r';
}
1 голос
/ 12 февраля 2010

Предположим, что есть какой-то токен, который делит файл на двоичный и ASCII-компоненты (скажем, "# END #" в отдельной строке), вы можете сделать что-то вроде следующего:

import java.io.*;

// ...

public static void main(String args[]) {
  try {
    FileInputStream f = new FileInputStream("object.bin");
    DataInputStream d = new DataInputStream(f);
    BufferedReader b = new BufferedReader(new InputStreamReader(d));

    String s = "";
    while ((s = b.readLine()) != "#END#") {
      // ASCII contents parsed here.
      System.out.println(s);
    }

    d.close();
  } catch (Exception e) {
      System.err.println("kablammo! " + e.getMessage());
  }
}
1 голос
/ 12 февраля 2010

Предполагая, что вы можете сказать, где находится конец содержимого ASCII, просто прочитайте символы из файла, пока не найдете его конец, и закройте файл.

1 голос
/ 12 февраля 2010

Мне неизвестны какие-либо классы Java, которые будут читать символы ASCII и игнорировать остальные, но самое простое, что я могу придумать, это использовать утилиту strings (при условии, что вы работаете в системе на основе Unix). ).

СИНТАКСИС строки [-] [-a] [-o] [-t формат] [-номер] [-n номер] [-] [файл ...]

ОПИСАНИЕ Strings ищет строки ASCII в двоичном файле или стандарте вход. Строки полезны для идентификации случайных объектных файлов и много других вещи. Строка - это любая последовательность из 4 (по умолчанию) или более печать символы, заканчивающиеся символом новой строки или нулем. Если только - флаг учитывая, строки выглядит во всех разделах объектных файлов, кроме (__TEXT, __ text) раздел. Если не указано файлов стандартного ввода является читать.

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

Редактировать : с дополнительной информацией о том, что все ASCII появляются в начале, было бы немного легче извлечь текст программно; тем не менее, это быстрее, чем писать код.

...