Понимание системных вызовов `read, write` в Unix - PullRequest
0 голосов
/ 21 февраля 2011

В проекте My Systems Programming мы реализуем программу сжатия / распаковки для сжатия текстовых файлов ASCII, удаляя нулевой старший бит и записывая вывод в отдельный файл, в зависимости от того, работает ли процедура сжатия или распаковки.Чтобы сделать это, профессор потребовал, чтобы мы использовали двоичные файлы и системные вызовы Unix, которые включают open, close, read, write и т. Д.

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

Это урезанная версия моего кода, за исключением проверки ошибок:

void compress(char readFile[]){

  char buffer[BUFFER] //buffer size set to 4096, but tunable to system preference
  int openReadFile;
  openReadFile= open(readFile, O_RDONLY);
}

Если яиспользуйте read для чтения данных в buffer, будут ли данные в буфере в двоичном или символьном формате?Ничто из того, с чем я сталкивался, не затрагивает эту деталь, и это очень важно для того, как я анализирую содержимое.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2011

read () будет считывать байты без какой-либо интерпретации (таким образом, «двоичный» режим).

Будучи двоичным, и вы хотите получить доступ к отдельным байтам, вы должны использовать буфер без знака char unsigned char buffer[BUFFER].Вы можете рассматривать char / unsigned char как байты, в linux они будут 8 битами.

Теперь, поскольку вы имеете дело с 8-битным ascii, сжатым до 7 бит, вам придется конвертироватьэти 7 бит в 8 бит снова, чтобы вы могли разобраться в данных.

Чтобы объяснить, что было сделано - рассмотрите текст Hey. Это 3 байта.Байты будут иметь 8 битов каждый, и в ascii это битовые комбинации:

01001000 01100101 01111001

Теперь, удалив самый старший бит из этого, вы сдвигаете оставшиеся биты на один бит кслева.

X1001000 X1100101 X1111001

Выше Х - бит, который нужно удалить.Удаляя эти и сдвигая другие, вы в итоге получаете байты с таким шаблоном:

10010001 10010111 11001000

Самые правые 3 бита просто заполнены нулями.,Там еще 3 байта.Со строкой в ​​8 байт мы сохранили 1 байт, так как это сжимало бы до 7 байт.

Теперь вам нужно сделать обратное для байтов, которые вы прочитали обратно в

0 голосов
/ 21 февраля 2011

Он будет считывать двоичное содержимое файла и загружать его в буфер памяти, на который указывает.Конечно, байт равен 8 битам, и поэтому символ представляет собой 8 битов, поэтому, если файл был обычным простым текстовым документом, вы получите строку для печати (будьте осторожны с тем, как он заканчивается, read возвращает числобайт (символы в простом текстовом файле с кодировкой ascii) читаются).

Редактировать: если файл, который вы читаете, не является текстовым файлом и представляет собой набор двоичных представлений, вы можете сделатьтип буфера и файла, даже если это структура.

0 голосов
/ 21 февраля 2011

Я приведу руководство по функции fopen (основанной на функции / примитиве open) из http://www.kernel.org/doc/man-pages/online/pages/man3/fopen.3.html

Строка режима также может включать буква «b» либо как последний символ или как символ между символы в любом из двух символов Строки, описанные выше. Это строго для совместимости с C89 и не имеет никакого эффекта; «б» игнорируется на всех системах, соответствующих POSIX, в том числе Linux

Так что даже функция высокого уровня игнорирует режим: -)

...