Копирование структуры битовых полей в массив с использованием memcpy - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь получить 8x8-битные значения из 64-битной структуры и сохранить их в массиве.

Я уже делал это, получая доступ к членам структуры, сдвигая биты и операцию ИЛИ. Однако я подумал об использовании функции memcpy . Я не уверен, что это надежно. Если я правильно понял, в моей структуре нет заполнения, так как оно заполнено на 64-битной основе, а моя структура имеет длину 64 бита. Однако у меня нет ожидаемого результата, когда я делаю копию.

typedef unsigned long long uint64_t;
typedef unsigned char uint8_t;

typedef struct frameHeader_t
    {
        uint64_t encryption       : 2;
        uint64_t frameVersion     : 2;
        uint64_t probeType        : 4;
        uint64_t dataType         : 5;
        uint64_t measurePeriod    : 3;
        uint64_t remontePeriod    : 4;
        uint64_t nbrMeasure       : 2;
        uint64_t year             : 7;
        uint64_t month            : 4;
        uint64_t day              : 5;
        uint64_t hour             : 5;
        uint64_t minute           : 6;
        uint64_t second           : 6;
        uint64_t randomization    : 5;
        uint64_t status           : 4;

    }FrameHeader;

int main()
{
    //declarations
    int i;
    uint8_t test[8];
    FrameHeader frameHeader;

    //put value
    frameHeader.encryption = 2;
    frameHeader.frameVersion = 0;
    frameHeader.probeType = 0;
    frameHeader.dataType = 1;
    frameHeader.measurePeriod = 0;
    frameHeader.remontePeriod = 6;
    frameHeader.nbrMeasure = 1;
    frameHeader.year = 19;
    frameHeader.month = 6;
    frameHeader.day = 25;
    frameHeader.hour = 15;
    frameHeader.minute = 49;
    frameHeader.second = 00;
    frameHeader.randomization = 15;
    frameHeader.status = 0;

    //copy
    memcpy(test, &frameHeader, 8);

    //print result
    for(i=0;i<sizeof(test);i++)
    {
        printf("%02x ", test[i]);
    }

    return 0;
}

Я ожидал: 80 08 64 9B 65 F8 80 F0

Я получил: 02 01 D6 C4 F2 8B 81 07

...