Записване на байтове във файл

В момента работя върху DBF файлов мениджър и имам някои проблеми...

Един от елементите, които съставляват заглавката, е последната дата, на която файлът е актуализиран. Проблемът е: форматът на полето е ГГММДД и ТРЯБВА да има 3 байта.

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

Типът файл в моя случай е 03h и това поле ТРЯБВА да използва само 1 байт. Доста съм объркан.


person Celso Shigaki    schedule 08.02.2014    source източник
comment
Е, помислете колко различни числа могат да бъдат представени с един байт: 256. Така че можете да съхранявате произволно 2 (десетично) число (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