2014-02-08 3 views
0

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

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

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

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

+0

Ну, подумайте о том, сколько различных чисел можно представить с помощью одного байта: 256 . Таким образом, вы можете хранить любое число из 2 (десятичных) цифр (0-99) внутри одного байта, с большим количеством свободного места. Помогает ли это? – Cameron

+0

Думаю, у меня есть идея, но как мне это сделать? Я использовал putc без sucess –

+0

Что пошло не так с putc? – twin

ответ

1

Я бы держать свои данные в 3 байта, как

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

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

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

Edit:

То, что я сделал в 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; 

Edit: как доступ работает. Ранее мы имели

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 

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

+0

Можете ли вы объяснить, что вы делали в my_date? Я все еще изучаю язык –

+0

Добавлена ​​информация о том, как это сделать. – webuster

+0

Намного понятнее. Спасибо, вебстер! –

0

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

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

Третий байт за день: 1-31

Смежные вопросы