Как идентифицировать содержание файла как ASCII или двоичный файл

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

28
задан Mechanical snail 6 August 2012 в 07:18
поделиться

10 ответов

Если файл содержит [только 1 120] десятичные байты 9– 13, 32– 126, это - вероятно, чистый текстовый ASCII-файл. Иначе это не. Однако это может все еще быть текст в другом кодировании.

, Если, в [1 121] дополнение к вышеупомянутым байтам, файл содержит [только 1 122] десятичные байты 128– 255, это - вероятно, текстовый файл в 8-разрядной или переменной длине основанное на ASCII кодирование, такое как ISO-8859-1, UTF-8 или ASCII+Big5. В противном случае в некоторых целях можно быть в состоянии остановиться здесь и полагать, что файл является двоичным. Однако это может все еще быть текст в 16-или 32-разрядном кодировании.

, Если файл не встречает вышеупомянутые ограничения, исследуйте первое 2– 4 байта файла для метка порядка байтов :

  • , Если первые два байта шестнадцатеричные FE FF, файл предварительно UTF-16 БЫТЬ.
  • , Если первые два байта шестнадцатеричные FF FE, и следующие два байта, не шестнадцатеричное число 00 00, файл предварительно LE UTF-16.
  • , Если первые четыре байта шестнадцатеричные 00 00 FE FF, файл предварительно UTF-32 БЫТЬ.
  • , Если первые четыре байта шестнадцатеричные FF FE 00 00, файл предварительно LE UTF-32.

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

, Если Вы не определили предварительное кодирование, файл мог бы все еще быть текстовым файлом в одной из этой кодировки, так как метка порядка байтов не обязательна, таким образом проверьте на всю кодировку в следующем списке:

  • , Если файл содержит [только 1 128] двухбайтовые слова с обратным порядком байтов с десятичными значениями 9– 13, 32– 126, и 128 или выше, файлом является, вероятно, UTF-16 БЫТЬ.
  • , Если файл содержит [только 1 129] двухбайтовые слова с прямым порядком байтов с десятичными значениями 9– 13, 32– 126, и 128 или выше, файл является, вероятно, LE UTF-16.
  • , Если файл содержит [только 1 130] четырехбайтовые слова с обратным порядком байтов с десятичными значениями 9– 13, 32– 126, и 128 или выше, файлом является, вероятно, UTF-32 БЫТЬ.
  • , Если файл содержит [только 1 131] четырехбайтовые слова с прямым порядком байтов с десятичными значениями 9– 13, 32– 126, и 128 или выше, файл является, вероятно, LE UTF-32.

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

51
ответ дан Daniel Cassidy 28 November 2019 в 02:18
поделиться

Вы выполняете итерации через него с помощью нормального цикла с stream.get () и проверяете, оценивает ли байт Вас, чтение <= 127. Один способ многих способов сделать это:

int c;
std::ifstream a("file.txt");
while((c = a.get()) != EOF && c <= 127) 
    ;
if(c == EOF) {
    /* file is all ASCII */
}

Однако, поскольку кто-то упомянул, все файлы являются двоичными файлами, в конце концов. Кроме того, не ясно, что Вы подразумеваете под "ASCII". Если Вы имеете в виду код символа, то действительно это - путь, которым Вы идете. Но если бы Вы имеете в виду только алфавитно-цифровые значения, Вам было бы нужно для другого способа пойти.

15
ответ дан Johannes Schaub - litb 28 November 2019 в 02:18
поделиться

Мой текстовый редактор выбирает присутствие пустых байтов. На практике это работает действительно хорошо: двоичный файл без пустых байтов чрезвычайно редок.

12
ответ дан bart 28 November 2019 в 02:18
поделиться

Посмотрите, как работает команда file ; у него есть три стратегии для определения типа файла:

В зависимости от вашей платформы и возможных файлов, которые вас интересуют, вы можете посмотреть на ее реализацию или даже вызвать ее.

10
ответ дан philant 28 November 2019 в 02:18
поделиться

Если вопрос состоит действительно в том, как обнаружить просто ASCII, то ответ litb является пятном на. Однако, если san после знал, как определить, содержит ли файл текст или нет, тогда проблема становится более сложным путем. ASCII - всего один - все больше непопулярный - способ представить текст. Системы Unicode - UTF16, UTF32 и UTF8 стали еще популярнее. В теории они могут быть легко протестированы на путем проверки, являются ли первые два байта unicocde меткой порядка байтов (BOM) 0xFEFF (или 0xFFFE, если порядок байтов инвертируется). Однако как те двухбайтовый винт много форматов файлов для систем Linux, они, как могут гарантировать, не будут там. Далее, двоичный файл мог бы запуститься с 0xFEFF.

Поиск 0x00 (или другие управляющие символы) не поможет также, если файл будет unicode. Если файл является UFT16, говорят, и файл содержит английский текст, то любой символ будет 0x00.

, Если Вы знаете язык, который текстовый файл будет записан в, тогда было бы возможно проанализировать байты и статистически определить, содержит ли это текст или нет. Например, наиболее распространенная буква на английском языке является E, сопровождаемым T. Таким образом, если файл содержит партии больше E и T, чем Z и X, это - вероятный текст. Конечно, было бы необходимо протестировать это как ASCII и различный unicodes для проверки.

, Если файл не записан на английском языке - или Вы хотите поддерживать несколько языков - тогда, эти только две оставленные опции состоят в том, чтобы посмотреть на расширение файла в Windows и проверять первые четыре байта по базе данных "волшебного файла" коды для определения типа файла и таким образом содержит ли это текст или нет.

7
ответ дан David Arno 28 November 2019 в 02:18
поделиться

Содержание каждый файл является двоичным. Так, не зная ничто иное, Вы не можете быть уверены.

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

Большинство двоичных файлов содержит фиксированный заголовок (на тип), можно искать, или можно взять расширение файла в качестве подсказки. Можно искать метки порядка байтов, если Вы ожидаете UTF-закодированные файлы, но они являются дополнительными также.

, Если Вы не определяете свой вопрос более тесно, не может быть категорического ответа.

9
ответ дан Tomalak 28 November 2019 в 02:18
поделиться

Ну, это зависит от вашего определения ASCII. Вы можете либо проверить значения с помощью кода ASCII < 128, либо определить определенный вами набор символов (например, 'a' - 'z', 'A' - 'Z', '0' - '9' ...) и обработать файл как двоичный файл, если он содержит некоторые другие символы.

Вы также можете проверить наличие регулярных разрывов строк (0x10 или 0x13,0x10) для обнаружения текстовых файлов.

1
ответ дан schnaader 28 November 2019 в 02:18
поделиться

Для проверки необходимо открыть файл в двоичном виде. Вы не можете открыть файл как текст. ASCII - фактически подмножество двоичного файла. После этого вы должны проверить значения байтов. ASCII имеет байтовые значения 0-127, но 0-31 являются управляющими символами. TAB, CR и LF являются единственными общими управляющими символами. Вы не можете (переносимо) использовать «A» и «Z»; нет гарантии, что они в ASCII (!). Если они вам нужны, вам придется определить.

const unsigned char ASCII_A = 0x41; // NOT 'A'
const unsigned char ASCII_Z = ASCII_A + 25;
1
ответ дан MSalters 28 November 2019 в 02:18
поделиться

На этот вопрос действительно нет правильного или неправильного ответа, только сложные решения, которые не будут работать для всех возможных текстовых файлов.

Вот ссылка a The Old New Thing Article о том, как блокнот определяет тип файла ascii. Это не идеально, но интересно посмотреть, как Microsoft справится с этим.

1
ответ дан Shane Powell 28 November 2019 в 02:18
поделиться

Лингвист Github использует библиотеку charlock holmes для обнаружения двоичных файлов, которая, в свою очередь, использует ICU обнаружение кодировки .

Библиотека ICU доступна для многих языков программирования, включая C и Java.

0
ответ дан eraxillan 28 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: