LINUX.ORG.RU

Работа с бинарными данными на Си


0

1

Здравствуйте. Подскажите пожалуйста, какие средства языка Си (НЕ ++), позволяют работать с бинарными данными (файлами, потоками), обрабатывать их? Какие библиотеки, функции? Вообще интересует, где можно на эту тему что-то посмотреть-почитать? Заранее спасибо.

Всё в стандартной есть.

Вообще интересует, где можно на эту тему что-то посмотреть-почитать?

Любой приличный учебник по Си. Лучше K&R

olibjerd ★★★★★ ()
Ответ на: комментарий от border-radius

Небуферизованные нужны далеко не всегда

Всегда, если ты сам отвечаешь за буферизацию.

А если надо по одному символу читать, ясен пень, проще буферизацию из stdio использовать.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от ChAnton

Если много in place работы, проще mmap'нуть наверное. Stdio переносимее, и буферизация настраивается. fopen, setvbuf, fread, fwrite.

anonymous ()
Ответ на: комментарий от ChAnton

Ты что собрался делать то с ними? Если картинки пожаты хоть как-то, все равно придется их в память распаковывать чтобы обработать. Тогда читать их лучше библиотекой их формата, а не самому. Если там raw данные и ты сам себе режиссер, то и правда никаких особенностей.

anonymous ()

Вообще интересует, где можно на эту тему что-то посмотреть-почитать?

Дык вы учебник-то, откройте. В любой, самой завалящей книжке по Си есть и про stdio и про read/write. Специализированных библиотек по бинарным форматам полно. Вы вообще с этой планеты?

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

Спасибо. Это мне известно неплохо. Интересуют именно особенности или какие-то специфические вещи(функции и библиотеки), если имеются, для работы с такими данными. Уточнил-именно цифровое видео.

ChAnton ★★ ()
Ответ на: комментарий от no-such-file

Да, я с этой планеты. Просто советуюсь, интересуют особенности, которые я могу например не знать, что впринципе логично.

ChAnton ★★ ()
Ответ на: комментарий от ChAnton

Просто удивительно читать такие вопросы о Си. Обычно люди трутся в области программирования некоторое время, разные другие языки тыкают и в общем в теме по поводу таких обыденностей.

цифровое видео

ffmpeg

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

Спасибо. Вы мне очень помогли. И критика всегда полезна)

ChAnton ★★ ()
Ответ на: комментарий от Eddy_Em

Возможно, однозначно буду совершенствовать мастерство. Спасибо вам.

ChAnton ★★ ()
Ответ на: комментарий от ChAnton

цифровое видео.

А ты напиши плеер-декодер MPEG2 (без использования сторонних библиотек), в процессе все специфические вещи и вылезут. И как файлы устроены, и как биты туда-сюда тягать, и что такое 4:2:0, и чем оно отличается от YV12.

i-rinat ★★★★★ ()
Ответ на: комментарий от ChAnton

Особенности возникают при переносе кода на другую архитектуру/компилятор, если разработчик не знал, что бывает разный порядок байт (endianness) и разный размер типов (sizeof(long)).

mky ★★★★★ ()
Ответ на: комментарий от Miguel

Что разыменовывание указателя? Вы имеете ввиду получение адреса в памяти для чтения потока данных побайтово? Это все понятно. Меня же просто интересовали какие средства и библиотеки существуют для этого вообще, ну кроме стандартной)))

ChAnton ★★ ()

Все средства работают именно с бинарными данными. В UNIX, в отличие от Венды позорной, нет разделения на текстовые и бинарные файлы.

man fopen

The mode string can also include the letter 'b' either as a last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-UNIX environments.)

akk ★★★★★ ()
Ответ на: комментарий от akk

Вы не поторопились по-поводу отсутствия разделения между текстовыми и бинарными данными в unix/linux? По-моему сильно поторопились. Вы представляете что такое вообще файл с точки зрения данных на носителе или в памяти? И смотря что вы имеете ввиду под разделением на текстовый и бинарные файлы, или вы имеете ввиду режим доступа и обработки файла? То что fopen работает с бинарными данными, это и так понятно.

ChAnton ★★ ()
Ответ на: комментарий от ChAnton

Вы не поторопились по-поводу отсутствия разделения между текстовыми и бинарными данными в unix/linux?

Нет, он не поторопился, он прав. Разницы нет.

      switch (*++mode)
        {
        case '\0':
          break;
        case '+':
          omode = O_RDWR;
          read_write &= _IO_IS_APPENDING;
#ifdef _LIBC
          last_recognized = mode;
#endif
          continue;
        case 'x':
          oflags |= O_EXCL;
#ifdef _LIBC
          last_recognized = mode;
#endif
          continue;
        case 'b':
#ifdef _LIBC
          last_recognized = mode;
#endif
          continue;

Как видишь, кроме сохранения указателя на последний обработанный символ, ничего не происходит. Это из eglibc.

То что fopen работает с бинарными данными, это и так понятно.

Прочитай ещё раз этот кусок в учебнике, потому как то, что ты сейчас написал — неправда.

i-rinat ★★★★★ ()
Ответ на: комментарий от ChAnton

Текстовый режим от бинарного отличается только преобразованием переводов строк. Так сложилось, что формат переводов строк в памяти совпадает с форматом переводов строк в файлах (в gnu/linux), так что преобразований не требуется.

i-rinat ★★★★★ ()
Ответ на: комментарий от akk

Это понятно. Спрашивал как раз об инструментах работы с данными без перевода в текстовые. Так и в винде ведь также все данные в бинарном виде. Вычислительная система ведь все обрабатывает в бинарном виде, а текстовое представление-это уже работа опрационной системы, не так важно какой. Конечно Unix работает с любым форматом более правильно и логично чем винда. Смысл вопроса был именно в этом. В инструментах. А то вы меня почти запутали тут)))

ChAnton ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.