Запись байтов в файл

В настоящее время я работаю над файловым менеджером DBF, и у меня есть некоторые проблемы...

Одним из элементов, составляющих заголовок, является дата последнего обновления файла. Проблема в том, что формат поля ГГММДД и ДОЛЖЕН иметь 3 байта.

Как можно записать дату в таком формате, используя всего 3 байта? Кроме того, еще одно поле представляет тип файла (есть ли в нем памятка или нет).

Тип файла в моем случае — 03h, и это поле ДОЛЖНО использовать только 1 байт. Я довольно смущен.


person Celso Shigaki    schedule 08.02.2014    source источник
comment
Что ж, подумайте о том, сколько различных чисел может быть представлено одним байтом: 256. Итак, вы можете хранить любое двухзначное (десятичное) число (0-99) внутри одного байта с большим запасом места. Это помогает?   -  person Cameron    schedule 09.02.2014
comment
Кажется, я понял идею, но как мне это сделать? Я использовал putc без успеха   -  person Celso Shigaki    schedule 09.02.2014
comment
Что пошло не так с putc?   -  person twin    schedule 09.02.2014
comment
Я не знал, как это сделать, поэтому использовал putc для записи даты, символ за символом. Это неправильно?   -  person Celso Shigaki    schedule 09.02.2014
comment
Символы занимают один байт каждый. Поэтому, если вам нужно записать ровно 3 байта, вам нужно написать число, которое имеет желаемую композицию. Смотрите мой ответ ниже. Надеюсь, я правильно понимаю вашу потребность.   -  person webuster    schedule 09.02.2014


Ответы (2)


Я бы держал ваши данные в 3 байтах как

  • первый байт = год
  • второй байт = месяц
  • третий байт = день

В каждом байте достаточно места для домена каждого поля (год, месяц, день). Вы можете записать их в виде целого числа с операциями побитового сдвига, например:

int year = 13;
int month = 7;
int day = 26;
int my_date = (year << 16) | (month << 8) | day;

Редактировать:

Что я сделал в my_date: я в основном объединил необходимую информацию (год, месяц, день) в серию битов (8 битов на информационное поле) в виде целого числа. Вы знаете, что int составляет 4 байта. Учтите для начала, что my_date равно 0, то есть все 32 бита равны 0. 4 его байта выглядят следующим образом ("|" обозначает конкатенацию; это для простоты чтения):

my_date = 0 | 0 | 0 | 0

Когда я пишу year << 16 у меня

year << 16 = 0 | year | 0 | 0

Подобным образом,

month << 8 = 0 | 0 | month | 0
day = 0 | 0 | 0 | day

Когда я применяю оператор OR ко всем из них, my_date выглядит так:

my_date = 0 | year | month | day

Доступ к ним:

year = (my_date & 0xFF0000) >> 16;
month = (my_date & 0xFF00) >> 8;
day = my_date & 0xFF;

Изменить: как работает доступ. У нас раньше было

my_date = 0 | year | month | day

Если вы сделаете, например, И с 0xFF00, что равно 0 | 0 | FF | 0, вы получите

my_date & 0xFF00 = 0 | 0 | month | 0

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

(my_date & 0xFF00) >> 8 = 0 | 0 | 0 | month = month

Надеюсь, теперь стало понятнее.

person webuster    schedule 08.02.2014
comment
Можете ли вы объяснить, что вы делали в my_date? я все еще учу язык - person Celso Shigaki; 09.02.2014

Первый байт года: 2000 + YY. Может считать от 2000 до 2255

Второй байт для месяца: 1-12

Третий байт для дня: 1-31

person Mustafa Chelik    schedule 08.02.2014