Я подозреваю, что fgets()
правильно читает символы NUL, но вы интерпретируете первый как конец прочитанной строки. Это сложно, потому что fgets()
предназначен для ввода текста, и он использует '\ 0' в качестве часового, не возвращая количество прочитанных символов. Даже если вы знаете, что каждая строка будет \n
завершена, есть вероятность, что необработанные двоичные данные, встроенные в строку, также будут включать \n
. Итак, переключитесь на fread()
, который предназначен для двоичного файла. Вы можете поместить размер сообщения фиксированной длины (например, 2 байта, 4 байта) в начало каждого сообщения, чтобы другая сторона могла сначала прочитать его, а затем сделать fread()
для точного размера сообщения, избегая беспорядочных проблем с частичным сообщение читает.
Если вы действительно хотите сохранить какой-то странный гибрид текста и двоичного кода, вы можете попробовать использовать ftell()
после fgets()
, чтобы выяснить, насколько далеко вы продвинулись в этом потоке, и, следовательно, в вашем буфере должно быть много символов, но я никогда не видел, чтобы какая-нибудь серьезная система делала что-то столь взломанное
Для записи, не делая чего-то заметно неэффективного, такого как шестнадцатеричное кодирование каждого отдельного символа в двоичных данных, вы можете просто кодировать проблемные символы. Например, можно использовать буквенные escape-последовательности строки C, с \0
, представляющим NUL, и \\
, с одним \
. Хотя визуально проверить это не так просто, программно проще кодировать / декодировать непечатаемые символы, например, используя восьмеричное значение \NNN
. Если в нем много непечатаемых символов, то подход с использованием кода uuencode base-64, такой как используемый в почтовых вложениях MIME, является еще одной подходящей, но полностью нечитаемой кодировкой.