Двойной, беззнаковый long long и массив char [C program] - PullRequest
0 голосов
/ 08 января 2019

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

    #define STEERINGCMD_MSG_BUFFERLENGTH    40

typedef struct GLOBAL_MSG
{
    u1 starter;
    u1 frameID;
    u1 length;
    u1 msgData[STEERINGCMD_MSG_BUFFERLENGTH];
    u4 CRYPTO;
};

GLOBAL_MSG  steeringCmdMsg;

struct SteeringData
{
    int                 isL1;
    int                 isL5;
    unsigned long long  CoPR;
    unsigned long long  CoPA;
    unsigned long long  CaPR;
    unsigned long long  CaPA;

};

void generateNextSteeringCmdMsg(SteeringData stData)
{
    steeringCmdMsg.starter = 0xAA;
    steeringCmdMsg.frameID = 68;
    steeringCmdMsg.length = STEERINGCMD_MSG_BUFFERLENGTH;

    if()
    {
        steeringCmdMsg.msgData[0] = 0x0F;
    }
    else if( )
    {
        steeringCmdMsg.msgData[0] = 0xF0;
    }
    steeringCmdMsg.msgData[1] = stData.CoPR & 0xFF;
    steeringCmdMsg.msgData[2] = stData.CoPR >> 8 & 0xFF;
    steeringCmdMsg.msgData[3] = stData.CoPR >> 16 & 0xFF;
    steeringCmdMsg.msgData[4] = stData.CoPR >> 24 & 0xFF;
    steeringCmdMsg.msgData[5] = stData.CoPR >> 32 & 0xFF;
    steeringCmdMsg.msgData[6] = stData.CoPR >> 40 & 0xFF;
    steeringCmdMsg.msgData[7] = stData.CoPR >> 48 & 0xFF;
    steeringCmdMsg.msgData[8] = stData.CoPR >> 56 & 0xFF;
    steeringCmdMsg.msgData[9] = stData.CoPA & 0xFF;
    steeringCmdMsg.msgData[10] = stData.CoPA >> 8 & 0xFF;
    steeringCmdMsg.msgData[11] = stData.CoPA >> 16 & 0xFF;
    steeringCmdMsg.msgData[12] = stData.CoPA >> 24 & 0xFF;
    steeringCmdMsg.msgData[13] = stData.CoPA >> 32 & 0xFF;
    steeringCmdMsg.msgData[14] = stData.CoPA >> 40 & 0xFF;
    steeringCmdMsg.msgData[15] = stData.CoPA >> 48 & 0xFF;
    steeringCmdMsg.msgData[16] = stData.CoPA >> 56 & 0xFF;
    steeringCmdMsg.msgData[17] = stData.CaPR & 0xFF;
    steeringCmdMsg.msgData[18] = stData.CaPR >> 8 & 0xFF;
    steeringCmdMsg.msgData[19] = stData.CaPR >> 16 & 0xFF;
    steeringCmdMsg.msgData[20] = stData.CaPR >> 24 & 0xFF;
    steeringCmdMsg.msgData[21] = stData.CaPR >> 32 & 0xFF;
    steeringCmdMsg.msgData[22] = stData.CaPR >> 40 & 0xFF;
    steeringCmdMsg.msgData[23] = stData.CaPR >> 48 & 0xFF;
    steeringCmdMsg.msgData[24] = stData.CaPR >> 56 & 0xFF;
    steeringCmdMsg.msgData[25] = stData.CaPA & 0xFF;
    steeringCmdMsg.msgData[26] = stData.CaPA >> 8 & 0xFF;
    steeringCmdMsg.msgData[27] = stData.CaPA >> 16 & 0xFF;
    steeringCmdMsg.msgData[28] = stData.CaPA >> 24 & 0xFF;
    steeringCmdMsg.msgData[29] = stData.CaPA >> 32 & 0xFF;
    steeringCmdMsg.msgData[30] = stData.CaPA >> 40 & 0xFF;
    steeringCmdMsg.msgData[31] = stData.CaPA >> 48 & 0xFF;
    steeringCmdMsg.msgData[32] = stData.CaPA >> 56 & 0xFF;

    char* actMsg =(char*) &steeringCmdMsg;
    steeringCmdMsg.crc32 = calculateCRYPTOForBuf(actMsg, STEERINGCMD_MSG_BUFFERLENGTH - 4);
}

void getSteeringMsg(i1 msg[STEERINGCMD_MSG_BUFFERLENGTH])
{
    char* actMsgData =(char*) &steeringCmdMsg.msgData;
    msg[0] =  steeringCmdMsg.starter;
    msg[1] =  steeringCmdMsg.frameID;
    msg[2] =  steeringCmdMsg.length;
    memcpy( &msg[3], actMsgData, STEERINGCMD_MSG_BUFFERLENGTH - 7);

    msg[39] = steeringCmdMsg.CRYPTO >>24;
    msg[38] = steeringCmdMsg.CRYPTO >>16;
    msg[37] = steeringCmdMsg.CRYPTO >>8;
    msg[36] = steeringCmdMsg.CRYPTO;

}

//used like this in the main
int main {

    i1 tmpMsg[STEERINGCMD_MSG_BUFFERLENGTH + 1];
    memset(tmpMsg, 0, STEERINGCMD_MSG_BUFFERLENGTH + 1);
    generateNextSteeringCmdMsg(steeringDataL1);
    getSteeringMsg(tmpMsg);
    write(tmpMsg, STEERINGCMD_MSG_BUFFERLENGTH);

    return 0;
}

Контекст: У меня есть оборудование, которое должно получать то, что мы называем «управляющим сообщением» в двоичном формате, которое содержит базовый заголовок и все параметры, содержащиеся в структуре SteeringData. В конце, со всеми параметрами, объединенными в msgData, я вычисляю то, что мы называем CRYPTO. И добавьте его в конец сообщения.

Проблема в том, что в этом коде stData.CoPR / CoPA ... имеют длинную беззнаковую длину (размер = 8), а в моем коде это double (struct.CoPR - и не может быть изменено, поскольку исходит от структура).

Так что я ищу лучший способ изменить эту функцию и заменить это длинное без знака на мою двойную структуру. Либо простое приведение, либо другой способ напрямую перевести мою двойную структуру в массив char. Но я не знаю, где посмотреть и какой самый надежный и безопасный способ сделать это будет 1012 *. 1014 *.

Не стесняйтесь просить больше объяснений, спасибо!

...