Кажется, оригинальный код правильно читает весь контент.
Проблема, по-видимому, заключается в использовании этих двоичных данных - их распечатка будет обрезаться при первом нуле, создавая впечатление, что присутствуют только 10 байтов.
Вы не можете использовать какие-либо методы, предназначенные для строк или символьных массивов, для вывода двоичных данных, поскольку они усекаются с первым нулевым байтом, создавая впечатление, что массив короче, чем на самом деле.
Проверьте некоторые другие вопросы, связанные с просмотром шестнадцатеричных данных:
как мне распечатать беззнаковый символ как шестнадцатеричный в c ++, используя ostream?
Преобразование двоичных данных в шестнадцатеричный формат для печати
Если вы хотите добавить это к строке - в каком формате? шестигранный? base64? Необработанные байты не будут работать.
Вот исходный код, который я разместил. Несколько небольших улучшений, а также улучшенный диагностический код:
int ret, size = 4096; /* Probably needs to be much bigger */
uint8_t *contents;
contents = malloc(size + 1);
if(contents == NULL)
{
log_message(WARNING, __func__, EMSG_MEMORY);
return (NULL);
}
ret = read(fd, contents, size);
if(ret < 0)
{
/* Error reading file */
free(contents);
log_message(WARNING, __func__, EMSG_READFILE);
return (NULL);
}
for(i = 0;i < ret;++i)
{
printf("%c", contents[i]);
/* printf("%0.2X", (char) contents[i]); /* Alternatively, print in hex */
}
Теперь рет действительно 10? Или вы просто получаете 10 байт при попытке распечатать вывод?