Где находится шестнадцатеричный код символа EOF?

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

Мой вопрос: я загрузил несколько инструментов, чтобы увидеть шестнадцатеричный вид текстового файла. но я не вижу шестнадцатеричный код для EOF(конец файла/NULL) или EOT(конец текста)


Таблицы кодов ASCII/Hex:

введите здесь описание изображения

Это результат работы инструментов просмотра Hex:

введите здесь описание изображения


Примечание. Мой входной файл представляет собой текстовый файл, его содержимое: Где находится шестнадцатеричный код EOF?

Цените свое время и внимание.


person Community    schedule 28.07.2014    source источник
comment
Ваше предположение в первом предложении неверно, в подавляющем большинстве случаев такого символа физически нет в файле. EOF — это символическое значение, предоставляемое библиотекой, чтобы уведомить вас, программиста, о достижении конца файла. Операционная система не обязана знать, где заканчивается файл (точнее, она не хранит эту информацию в самом файле).   -  person user657267    schedule 28.07.2014
comment
@user657267 user657267 Я написал программу, которая искала в текстовом файле символ A . А если в тексте нет буквы А, переместите файл в специальную директорию. Я хочу знать, есть ли способ обмануть мою программу? например, добавление шестнадцатеричного кода NULL/EOF/EOT в середине моего входного текста? Спасибо.   -  person    schedule 28.07.2014
comment
Навряд ли. В cmd.exe ^Z рассматривается как конец ввода, поэтому, если вы сделаете что-то вроде type whatever.txt, он сломается, когда нажмет ^Z, если файл содержит его, но это относится только к командной строке Windows. io библиотеки для программирования должны с радостью разобрать его как еще один символ.   -  person user657267    schedule 28.07.2014
comment
^Z был распространен в текстовых файлах MS-DOS и до сих пор используется во многих протоколах передачи. Я ожидаю, что большинство пользователей SO не помнят MS-Kermit, xmoden, ymodem и т. д. Он по-прежнему создается файлом ind$, и его удаление является сложной задачей. Он выбрасывает неприятные сообщения в gedit, так что да, он существует.   -  person mckenzm    schedule 22.02.2019
comment
@user657267 user657267 в некоторых случаях ОС может не считывать данные из файловой системы, поэтому ей необходимо заранее знать размер файла, в противном случае нужно знать, где находится конец. Применяется к потоку или необработанному.   -  person mckenzm    schedule 12.03.2019


Ответы (6)


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

На самом деле, значение "EOF", возвращаемое, например, функциями C, такими как getchar, явно является значением int за пределами диапазона байта, поэтому его невозможно сохранить в файле!

Иногда некоторые форматы файлов настаивают на добавлении терминаторов NUL (вероятно, потому, что именно так строки обычно хранятся в C), хотя обычно они ограничивают несколько записей в одном файле, а не в файле в целом. И такое оформление обычно лишает файл права считаться «текстовым файлом».

Коды ASCII, такие как ETX и NUL, восходят к временам телетайпов и друзей. NUL используется в C для строк в памяти, но это не имеет отношения к файловым системам.

person Community    schedule 28.07.2014
comment
Я написал программу, которая искала в текстовом файле символ A. А если в тексте нет буквы А, переместите файл в специальную директорию. Я хочу знать, есть ли способ обмануть мою программу? например, добавление шестнадцатеричного кода NULL/EOF/EOT в середине моего входного текста? Спасибо. - person ; 28.07.2014
comment
@ User1-St Зависит от того, как вы читаете файл и выполняете поиск (как я уже сказал, многие функции C считают, что NUL означает конец строки в памяти), но непреодолимых трудностей не бывает. - person ; 28.07.2014
comment
Как я могу обмануть свою программу. предположим, что моя программа считает, что Null означает конец файла. В этом случае, если я добавлю 0x00 в середине шестнадцатеричного представления моего файла, программа будет обманута? - person ; 28.07.2014
comment
@ User1-St Да, почти по определению. Вот почему вы должны написать свою программу, а не делать что-то глупое ;-) - person ; 28.07.2014
comment
:D Так что пусть пишут программу, а не делают глупостей :)) спасибо. - person ; 28.07.2014
comment
Если ваша среда выполнения делает различие между текстовым и двоичным режимами, и вы ожидаете управляющие символы (‹ 20h), убедитесь, что вы открываете в двоичном режиме, просто чтобы быть уверенным. Вы можете преобразовать в текст впоследствии. - person Maarten Bodewes; 29.07.2014
comment
@delnan Где операционная система сохраняет файл метаданных? Могу ли я найти его на жестком диске? - person ; 04.08.2014
comment
@ User1-St Метаданные хранятся где-то на жестком диске (где и как во многом зависит от файловой системы), но это не сам файл! Доступ к метаданным обычно можно получить через другие API (например, stat в системах Unix-y). - person ; 04.08.2014
comment
@owlstead, не могли бы вы объяснить яснее? Я не понимаю вашего комментария! Спасибо - person ; 04.08.2014
comment
@delnan можно ли внести в него изменения или он защищен? Вы знаете, как получить к нему доступ в Windows? Какие API? Агян, спасибо большое!! :) - person ; 04.08.2014
comment
@ User1-St Боюсь, объяснение всего этого выходит за рамки этих комментариев. Сядьте, почитайте немного (stat, организация простой файловой системы, такой как FAT), хорошенько подумайте и попробуйте придумать один или пару вопросов, которые вы можете задать отдельно на Stack Overflow. - person ; 04.08.2014
comment
@delnan Если текстовый режим реагирует на управляющие символы, вы можете никогда не увидеть их обратно, вполне может быть, что он перестанет читать после символа 00h. Вы либо должны знать, как ведет себя среда выполнения, либо открывать в двоичном режиме. - person Maarten Bodewes; 04.08.2014
comment
@delnan, хорошо, дорогой друг. Спасибо :) - person ; 04.08.2014
comment
@owlstead Какой файл открыть в двоичном режиме? В конце текстового файла нет 00h. - person ; 04.08.2014

Давным-давно существовал маркер Конец файла, но он не использовался в файлах уже много лет.

Вы можете продемонстрировать отдаленное эхо этого на окнах, используя:

C:\>copy con junk.txt
Hello
Hello again
- Press <Ctrl> and <z>
C:\>dump junk.txt
junk.txt:
00000000  4865 6c6c 6f0d 0a48 656c 6c6f 2061 6761 Hello..Hello aga
00000010  696e 0d0a                               in..
C:\>

Обратите внимание на использование Ctrl-Z в качестве маркера EOT.

Однако обратите внимание, что Ctrl-Z больше не отображается в файле — раньше он отображался как 0x1a, но только в некоторых операционных системах, и то не всегда.

Использование ETX (0x03) прекратилось еще до тех смутных и далеких времен.

person OldCurmudgeon    schedule 28.07.2014

Нет такой вещи, как EOF. EOF — это просто значение, возвращаемое функциями чтения файла, чтобы сообщить вам, что указатель файла достиг конца файла.

person David Xu    schedule 28.07.2014
comment
Я написал программу, которая искала в текстовом файле символ A. А если в тексте нет буквы А, переместите файл в специальную директорию. Я хочу знать, есть ли способ обмануть мою программу? например, добавление шестнадцатеричного кода NULL/EOF/EOT в середине моего входного текста? Спасибо. - person ; 28.07.2014
comment
Пока ваша программа работает на чужой машине, ее всегда можно обмануть. - person David Xu; 28.07.2014
comment
Как? Вы имели в виду, что они могут дать моей программе текстовый файл, в содержании которого есть буква А, и моя программа этого не заметит? - person ; 28.07.2014
comment
если ваша программа работает на чужой машине, и они ДЕЙСТВИТЕЛЬНО хотят ее обмануть, они могут, даже с помощью отладчика, такого как OllyDbg, или путем перехвата функций API и т. д., существует множество способов обмануть программы. - person David Xu; 28.07.2014
comment
Я хочу знать, есть ли способ обмануть программу, только изменив текстовый файл? Предположим, что они не могут ничего установить или отредактировать на хосте (что моя программа установила на нем). - person ; 28.07.2014
comment
Если вы правильно написали свою программу, то нет, ее не обманут - person David Xu; 28.07.2014
comment
Спрри, это правильно или нет? программа продолжает читать текстовый файл, пока не получит специальный шестнадцатеричный код, который зависит от языка программирования, который я использую. - person ; 28.07.2014
comment
Нет! Когда функция чтения возвращает FEOF или 1. Как программа понимает, что точка является концом файла? - person ; 28.07.2014

Байт EOT (0x04) по сей день используется терминалами Unix tty для обозначения окончания ввода. Вы вводите его с помощью Ctrl + D (т.е. ^D), чтобы закончить ввод в оболочку или любую другую программу, читающую со стандартного ввода.

Однако, как указывали другие, это отличается от EOF, который является условием, а не частью данных как таковых.

person kralyk    schedule 07.05.2018

Когда-то были даже разные символы EOF (для разных операционных систем). Больше не видел ни одного. (Обычно файлы были в блоках по 128 байт.) Для кодирования PITA, как в настоящее время спецификации.

Вместо этого все еще есть int read(), который обычно предоставляет байтовое значение, но для EOF предоставляет -1.

Символ NUL является терминатором строки в C. В java вы можете иметь символ NUL в середине строки. Чтобы быть совместимым с C, сгенерированные байты UTF-8 используют многобайтовую кодировку как для символов Unicode> 127, так и для NUL.

(Часть из этого, вероятно, уже известна.)

person Joop Eggen    schedule 28.07.2014
comment
UTF-8 не генерирует несколько байтов для NUL. Код ASCII 0 не является особенным, UTF-8 полностью совместим с ASCII. Более важным для C является тот факт, что ни одна многобайтовая последовательность UTF-8 не содержит 0 байт (или любой байт ‹ 128, если на то пошло), поэтому завершение NUL может хранить все кодовые точки Unicode, кроме U+0000. . - person ; 28.07.2014
comment
@delnan: так называемая модифицированная UTF-8 также использует многобайтовую кодировку для NUL, что дает 0xC0, 0x80. Таким образом можно обрабатывать символ NUL в строке C UTF-8. - person Joop Eggen; 28.07.2014
comment
Но измененная UTF-8 не является UTF-8. Тоже довольно неясно. - person ; 28.07.2014
comment
en.wikipedia.org/wiki/UTF-8#Modified_UTF-8 упоминает сериализацию объектов. Также DataOutputStream использует это в [writeUTF}(docs.oracle.com/javase/7/docs/api/java/io/). Вы правы: официальная UTF-8 требует самой короткой многобайтовой последовательности: 0x00. - person Joop Eggen; 28.07.2014
comment
@ User1-St: хорошо, это четвертый ответ, который я читаю и четвертый раз, когда вы добавляете этот вопрос. Не делайте этого, это раздражает и противоречит политике SO. Последующие вопросы не предназначены для того, чтобы задавать их в комментариях; они должны быть отредактированы в вашем сообщении (если они имеют отношение к исходному вопросу - это нет) или заданы отдельно. Но в основном это просто раздражает. - person Jongware; 28.07.2014

В 7-битном мире Wintel это 0x1A или chr(26).

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

Существуют и другие такие контрольные значения для старых систем, и, например, EOL (CR, LF, CR + LF), необходимо время от времени ожидать.

Может быть источником раздражения то, что он все еще используется, например, на том же уровне, что и return(0).

person mckenzm    schedule 22.02.2019