как загнать значения в struct

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fucker"ok, 19 Feb 2006.

  1. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    Товарищи, допустим есть такой код (структура. Не знаю как правельно это называется):
    Code:
    typedef struct packet
    {
            int num;
            char[8] msg;
    }
    
    
    И есть вот такое дело:
    Code:
    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 так-как не знаю как правельно постоить такой вопрос.
     
  2. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Начнем с того что описание структуры будем писать так
    Code:
    [b]typedef[/b] [b]struct[/b]
    {
            [b]int[/b] num;
            [b]char[/b] msg[8]; [color=gray]// а не char[8] msg[/color]
    } packet;
    
    только тут байтов - 8 + sizeof( num ) = 8 + 4 = 12 а буфер у тебя 15.
    Но первые 12 байт всеравно можно загнать, тоесть если я тебя понял, как бы наложить на структуру.
    Непосредственное копирование памяти:

    Code:
    packet p;
    memcpy( &p, buff, [b]sizeof[/b]( buff ) );
    
    Тогда можно будет обращаться так
    p.num

    Или просто ставим указатель на структуру на адрес буфа
    Code:
    packet [b]*[/b]p; [color=gray]// как указатель на структуру packet[/color]
    p = (packet[b]*[/b])buff;
    
    Тогда можно будет обращаться так
    p->num

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

    тест:

    Code:
    [b]#include[/b] <stdio.h>
    [b]#include[/b] <windows.h>
    
    [b]typedef struct[/b]
    {
            [b]int[/b] num;
            [b]char[/b] msg[8];
    } packet;
    
    [b]char[/b] buff[] = {
            0x00, 0x02, 0x10, 0x00, 0x00,
            0x00, 0x02, 0x10, 0x00, 0x00,
            0x00, 0x02, 0x10, 0x00, 0x00
    };
    
    [b]int[/b] main( [b]int[/b] argc, [b]char*[/b] argv[] )
    {
    	[color=gray]// вариант 1[/color]
    	packet *p = (packet*)buff;
    	printf( "p->num=%d\n", p->num );
    
            [color=gray]// вариант 2[/color]
    	packet p2;
    	memcpy( &p2, buff, sizeof( buff ) );
    	printf( "p2.num=%d\n", p2.num );
    	
    	[b]return[/b] 0;
    }
    
     
    #2 KEZ, 19 Feb 2006
    Last edited: 19 Feb 2006
    2 people like this.
  3. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    Спасибо. То что нужно.

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

    RekRut Elder - Старейшина

    Joined:
    27 Feb 2006
    Messages:
    116
    Likes Received:
    26
    Reputations:
    0
    А почему перед "return 0;" не написана строка " getchar(); "
    У меня без этой строчки программа запускается и тут же исчезает!
     
  5. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    а нахрена?

    в консоли не пробовал? лол.
     
  6. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    fucker"ok, не забудь, что размер буфера и структуры различны (судя по примеру). memcpy(&p2, buff, sizeof( buff )) тут не прокатит, надо наоборот: memcpy( &p2, buff, sizeof( packet )); иначе при копировании хвост структуры будет перезаписан. бугага, Кез, ты кстати парню уязвимость впарил. причем ту о которой статью писал =)
     
    1 person likes this.
  7. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    А ты прочитай внимательнее вопрос, а потом вставляй свои тупые "бугага"