попытка скопировать участников структуры в массив байтов в c

1113 Да, это возможно.

Вам необходимо подключить политики и связанные с ними действия. Лучше всего, я бы сказал, создать новый проект с включенным внешним интерфейсом и посмотреть, как он настроен. Это использует промежуточное программное обеспечение политики, чтобы вызвать действия политики.

module.exports.policies = {

  '*': 'is-logged-in',

  // Bypass the `is-logged-in` policy for:
  'entrance/*': true,
  'account/logout': true,
  'view-homepage-or-redirect': true,
  'deliver-contact-form-message': true,
};

Здесь вы видите, что policy.js в папке /config вызывает is-logged-in для всех контроллеров по умолчанию. Вы также видите, что есть некоторые исключения, добавленные ниже.

is-logged-in - это файл /api/policies/is-logged-in.js:

module.exports = async function (req, res, proceed) {
  // If `req.me` is set, then we know that this request originated
  // from a logged-in user.
  if (req.me) {
    return proceed();
  }

  // Otherwise, this request did not come from a logged-in user.
  return res.unauthorized();
};

Это часть, которая проверяет статус пользователя, вошедшего в систему. Вы можете видеть, что он использует часть req.me, которая установлена ​​в api/hooks/custom/index.js. Здесь он загружает пользователя из базы данных и делает данные зарегистрированных пользователей доступными для объекта req.

Если у вас нет или вы хотите использовать этот хук, вы можете обменяться req.me с req.session.userId, предполагая, что вы установили userId для объекта сеанса в вашем обработчике входа в систему , Пример из Sails-code:

....
var userRecord = await User.findOne({
  emailAddress: inputs.emailAddress.toLowerCase(),
});

// check user exist
....

// check password
....

//check remember-me 
....

// Modify the active session instance.
this.req.session.userId = userRecord.id;

// Send success response (this is where the session actually gets persisted)
return exits.success();
....

Я надеюсь, что это поможет вам выбрать правильный путь, по крайней мере, с точки зрения того, где копать глубже.

9
задан thkala 2 December 2011 в 23:27
поделиться

5 ответов

Извините, я не видел Ваш комментарий до сейчас. Код ниже компиляций на Linux очень хорошо, таким образом, я надеюсь, что он работает на Вас.
printf () печатает в шестнадцатеричном числе, Вы получите 2 символа для каждого байта.

#include <stdio.h>

struct msg_on_send
{
char descriptor_msg[5];
int  address;
char space;
char cmdmsg[5];
char CR; 
char LF; 
};

void USARTWrite(const void *object, size_t size)    
{
    const unsigned char *byte;
      for ( byte = object; size--; ++byte )                                     
      {   
          printf("%02X", *byte);
      }   
      putchar('\n');
}

int main (int argc, char**argv)
{
    struct msg_on_send myMsg;
    unsigned char* ptr= (unsigned char*)&myMsg;

    USARTWrite(ptr, sizeof(myMsg));

    return 0;
}

Я надеюсь, что это помогает.

~
~

6
ответ дан 4 December 2019 в 13:50
поделиться

Вы не должны на самом деле копировать структуру в массив байтов. Вы могли дополнительно сделать это:

struct msg_on_send myMessage;

// code to set myMessage to whatever values...

// get a byte pointer that points to the beginning of the struct    
uint8_t *bytePtr = (uint8_t*)&myMessage;

// pass that into the write function, and it will write the amount of bytes passed in
USARTWrite(bytePtr, sizeof(myMessage));

Питание указателей!:)

7
ответ дан 4 December 2019 в 13:50
поделиться

Ваш struct вот просто массив байтов, именно никакие указатели не указывают из него.

Копия от участника к участнику, скорее всего, выполняется для преодоления выравнивания, как (char*) &address вероятно, будет больше, чем ((char*) &descriptor_msg) + 5.

USARTWrite отправляет HEX коды байтов Вашей структуры к stdout, но выравнивание отбрасываний. Компиляция этого кода с различными стратегиями выравнивания приведет к различным выводам.

Включите свое описание структуры в #pragma pack(push, n) и #pragma pack(pop) вызвать выравнивание и просто скопировать Ваш от байта к байту структуры.

0
ответ дан 4 December 2019 в 13:50
поделиться

Это довольно просто: 1. ArrayBuild берет указатель на message_on_send структуру, и для каждого участника там, использует memcpy для копирования байтов в массив символов, который был передан в подобном так -

char byteArray[17]; // This assumes 4-byte ints
                    // be careful though, the length *must* be long enough, or 
                    // Bad Things will happen
size_t msgSize; // Holds the size of the message built by ArrayBuild,
                // passed to USARTWrite
struct msg_on_send myMessage;
// Code to fill up myMessage appropriately

msgSize = ArrayBuild(byteArray, &myMessage); // need the & to pass a pointer as required

USARTWrite(myMessage, msgSize);

USARTWrite просто дают массив символов и размер - он захватывает каждый символ в свою очередь и печатает его на экран как шестнадцатеричное значение с printf ().

'Волшебство' находится в ArrayBuild - memcpy, делает литеральную копию байтов от источника до места назначения, без перевода. Принимая 4 байта ints, массив, созданный функцией, будет похож так:

                     1 1 1 1 1 1 1 
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
|   A     |   B   |C|    D    |E|F|

A = descriptor_msg (char[5])
B = address (int)
C = space (char)
D = cmdmsg (char[5])
E = CR (char)
F = LF (char)

Я предположил бы, что в 'реальном' приложении, printf () вызов будет заменен вызовом к записи последовательного порта.

1
ответ дан 4 December 2019 в 13:50
поделиться

Если я хочу рассматривать структуру как массив байтов, я обычно использую объединение для объединения структуры с массивом байтов. Например:

typedef union
{
    struct
    { 
        char descriptor_msg[5]; 
        int  address; 
        char space; 
        char cmdmsg[5]; 
        char CR; 
        char LF; 
    };
    BYTE bytes[];
} msg_on_send;
1
ответ дан 4 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: