Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   как загнать значения в struct (https://forum.antichat.xyz/showthread.php?t=14698)

fucker"ok 19.02.2006 13:17

как загнать значения в struct
 
Товарищи, допустим есть такой код (структура. Не знаю как правельно это называется):
Код:

typedef struct packet
{
        int num;
        char[8] msg;
}

И есть вот такое дело:
Код:

char buff[] = {
        0x00, 0x02, 0x10, 0x00, 0x00,
        0x00, 0x02, 0x10, 0x00, 0x00,
        0x00, 0x02, 0x10, 0x00, 0x00 };
//значение могут быть другие, это не важно
struct packet pack;

Так вот мне нужно загнать buff в структуру packet.
Тоесть чтобы у переменной pack были значение buff и я мог обратится к pack.num и тд

Конечно можно считать 4 байта в pack.num ,а потом 8 байт в pack.msg ,НО это не красиво, да и структура может быть другой (гараздо больше и тд )

Вообщем подскажите, если вы меня поняли :)
зы
не могу спросить у google так-как не знаю как правельно постоить такой вопрос.

KEZ 19.02.2006 13:59

Начнем с того что описание структуры будем писать так
Код:

typedef struct
{
        int num;
        char msg[8]; // а не char[8] msg
} packet;

только тут байтов - 8 + sizeof( num ) = 8 + 4 = 12 а буфер у тебя 15.
Но первые 12 байт всеравно можно загнать, тоесть если я тебя понял, как бы наложить на структуру.
Непосредственное копирование памяти:

Код:

packet p;
memcpy( &p, buff, sizeof( buff ) );

Тогда можно будет обращаться так
p.num

Или просто ставим указатель на структуру на адрес буфа
Код:

packet *p; // как указатель на структуру packet
p = (packet*)buff;

Тогда можно будет обращаться так
p->num

В твоем случае в num получается 1049088 или 0x100200
Вопрос ты задал довольно корректно, что странно для форума.античат.ру

тест:

Код:

#include <stdio.h>
#include <windows.h>

typedef struct
{
        int num;
        char msg[8];
} packet;

char buff[] = {
        0x00, 0x02, 0x10, 0x00, 0x00,
        0x00, 0x02, 0x10, 0x00, 0x00,
        0x00, 0x02, 0x10, 0x00, 0x00
};

int main( int argc, char* argv[] )
{
        // вариант 1
        packet *p = (packet*)buff;
        printf( "p->num=%d\n", p->num );

        // вариант 2
        packet p2;
        memcpy( &p2, buff, sizeof( buff ) );
        printf( "p2.num=%d\n", p2.num );
       
        return 0;
}


fucker"ok 19.02.2006 14:18

Спасибо. То что нужно.

в С++ я человек новый, поэтому указатели для меня нечто пришедшее из космоса :)

RekRut 28.02.2006 22:34

А почему перед "return 0;" не написана строка " getchar(); "
У меня без этой строчки программа запускается и тут же исчезает!

nerezus 28.02.2006 22:50

Цитата:

А почему перед "return 0;" не написана строка " getchar(); "
а нахрена?

Цитата:

У меня без этой строчки программа запускается и тут же исчезает!
в консоли не пробовал? лол.

sn0w 27.03.2006 18:29

fucker"ok, не забудь, что размер буфера и структуры различны (судя по примеру). memcpy(&p2, buff, sizeof( buff )) тут не прокатит, надо наоборот: memcpy( &p2, buff, sizeof( packet )); иначе при копировании хвост структуры будет перезаписан. бугага, Кез, ты кстати парню уязвимость впарил. причем ту о которой статью писал =)

KEZ 01.04.2006 17:16

А ты прочитай внимательнее вопрос, а потом вставляй свои тупые "бугага"


Время: 10:20