Определите, содержит ли файл двоичные данные или данные ASCII - PullRequest
1 голос
/ 05 ноября 2010

Я беру файл в качестве входного аргумента, и мне нужно определить, являются ли данные двоичными или нет (ну, ASCII или двоичные, я думаю), аналогично команде 'file' в * nix, но в моем приложении.

Я не уверен, как это сделать, потому что, когда я читаю данные, я делаю это так:

fread(&rndByte, sizeof(unsigned int), 1, fp);
// reading one unsigned int at a time from file fp

Я думал о тестировании, если значение<128 раз, но не знаю, как это проверить, читая целое int одновременно.Я хотя бы зацикливался на 1 байт за раз и проверял таким образом, но система, на которой я работаю, не любит сдвиги, которые я делаю. </p>

Есть идеи, предложения?

Ответы [ 3 ]

4 голосов
/ 05 ноября 2010

Я думал о тестировании, если значение <128 </p>

Наивно думать, что текст, даже на английском, никогда не будет содержать символов вне базовой латиницы. Программы Microsoft® особенно любят добавлять тире & mdash; и & ldquo; умные цитаты & rdquo; к тексту.

Лучший подход - искать управляющие символы ASCII. Текстовый файл будет иметь много разрывов строк (\n и / или \r в зависимости от платформы) и, возможно, некоторые вкладки, но почти никогда не будет других управляющих символов.

2 голосов
/ 05 ноября 2010

Как уже говорили другие (хотя и менее прямо), ограничивать текст ASCII в 2010 году полностью наоборот. Поскольку вероятность нетекстового разбора двоичных данных в формате UTF-8 чрезвычайно низка, гораздо лучшим подходом будет попытка синтаксического анализа.весь файл как UTF-8, и объявлять его двоичным при первом сбое.

Как уже говорили другие, вместо того, чтобы вызывать fread или fgetc снова и снова для крошечных блоков, вы должны1005 * больших кусков (1-4k) за раз в буфер фиксированного размера и запустите ваш синтаксический анализатор, читая новый кусок всякий раз, когда вы достигаете конца.(И если ваш синтаксический анализатор UTF-8 не может быть легко перезапущен, может иметь смысл memcpy конец буфера обратно в начало и заполнять всякий раз, когда в буфере осталось менее 4 байтов.)

1 голос
/ 05 ноября 2010

Используйте fread(), чтобы получить весь 1024-байтовый (или 512 или любой другой, который вам подходит) буфер, а затем сканировать этот буфер побайтно, ища что-то с установленным восьмым битом.Это, вероятно, довольно близко к тому, что делает file (1), за исключением того, что file (1) имеет более сложные шаблоны, и он, вероятно, не беспокоится о таком большом буфере.

Вы также можете получить исходный код для find и узнайте, как это работает.

...