Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Скопировать в структуру данные


Автор: klyxa 5.2.2011, 22:27
привет.есть структура
Код

typedef struct __header__
{
    UCHAR DstMAC[6];
    UCHAR SrcMAC[6];
    USHORT EthType; 
}eth_head;

typedef struct __packet__
{
    eth_head header;
    UCHAR      *data;
} m_packet;


есть код
Код

BOOL DoReadProc(m_packet *packet)
{
    PUCHAR      buf;
    BOOLEAN   status;
    ULONG       bts;

    buf = malloc(100);
    
    if (buf == NULL)
        return FALSE;

    while(1)
   {
    status = (BOOLEAN)ReadFile(glob_var.hndl, (LPVOID)buf, 100, &bts, NULL);
            
        if (status)
        {
        //copy to packet
                return TRUE;
        }            
    
    }
    return FALSE;
}


Как скопировать в структуру(packet) данные из буфера(buf)?



Автор: volatile 5.2.2011, 23:28
вообще-то вот так:
Код

memcpy(packet, buf, sizeof(m_packet));

Но вы уверены что структура файла совпадает со структурой m_packet?
если она была записана на машине с другим порядком байтов, то получится фигня.
так-же есть еще проблема выравнивания.
Вобщем это все не безопасный код, и его можно использовать только для внутренних нужд.
в серьезных проектах, нужно использовать сериализацию, или что-то более надёжное.

Автор: volatile 5.2.2011, 23:48
И еще, зачем вечный цикл?
Цитата(klyxa @  5.2.2011,  22:27 Найти цитируемый пост)
 while(1)


Автор: klyxa 6.2.2011, 09:33
Код

Но вы уверены что структура файла совпадает со структурой m_packet?

насчёт заголовка да, а оставшуюся часть я хотел представить как набор байтов.


Код

И еще, зачем вечный цикл?

ReadFile для обращения к драйверу. Если в очереди пакетов драйвера окажется принятый пакет, то я скопирую данные в буфер,переданный в параметрах ReadFile.
Т.к. пакета может не оказаться я закинул его в цикл. 

И если пакет всё же пришёл, то нужно данные оформить в виде описанной структуры. Смогу ли  я таким примитивным способом это сделать,т.е. голова,хвост?

Автор: volatile 6.2.2011, 11:08
Код

typedef struct __packet__
{
    eth_head header;
    UCHAR      *data; // Это указатель. этого делать нельзя. 
} m_packet;


Если вы хотите представить данные после заголовка, просто набором байтов, то что-то типа 
Код

UCHAR  data[size]; // size - размер блока байтов.


Автор: volatile 6.2.2011, 11:29
кроме того, как я писал выше, есть еще проблема выравнивания.
например
Код

   UCHAR DstMAC[6];
   UCHAR SrcMAC[6];
это будет выглядеть примерно так: 6 байтов DstMAC, затем 2 байта не используется, для выравнивания на 32 бита.
Затем следующие 6 байтов SrcMAC, и так далее.

Если вы записывали данные именно этой-же программой, на этом же компе, то проблем не будет, но скорей всего вы ожидаете совсем другого.
Если не хотите чтоб было выравнивание на границу слова, используйте
Код

#pragma pack(push, 1)
  // ...
  // здесь описание ваших структур.
  // ...
#pragma pack(pop)

Автор: tapa 6.2.2011, 13:17
volatile, спасибо буду думать smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)