ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

как загнать значения в struct
  #1  
Старый 19.02.2006, 13:17
Аватар для fucker"ok
fucker"ok
Познавший АНТИЧАТ
Регистрация: 21.11.2004
Сообщений: 1,137
Провел на форуме:
2487541

Репутация: 761


По умолчанию как загнать значения в 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 так-как не знаю как правельно постоить такой вопрос.
 
Ответить с цитированием

  #2  
Старый 19.02.2006, 13:59
Аватар для KEZ
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

Начнем с того что описание структуры будем писать так
Код:
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;
}

Последний раз редактировалось KEZ; 19.02.2006 в 14:16..
 
Ответить с цитированием

  #3  
Старый 19.02.2006, 14:18
Аватар для fucker"ok
fucker"ok
Познавший АНТИЧАТ
Регистрация: 21.11.2004
Сообщений: 1,137
Провел на форуме:
2487541

Репутация: 761


По умолчанию

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

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

  #4  
Старый 28.02.2006, 22:34
Аватар для RekRut
RekRut
Участник форума
Регистрация: 27.02.2006
Сообщений: 261
Провел на форуме:
515774

Репутация: 71
По умолчанию

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

  #5  
Старый 28.02.2006, 22:50
Аватар для nerezus
nerezus
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме:
6490435

Репутация: 2290


Отправить сообщение для nerezus с помощью ICQ
По умолчанию

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

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

  #6  
Старый 27.03.2006, 18:29
Аватар для sn0w
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме:
1290766

Репутация: 1236


По умолчанию

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


snow white world wide
 
Ответить с цитированием

  #7  
Старый 01.04.2006, 17:16
Аватар для KEZ
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скрыть модуль ядра в линуксе? rent0n *nix 11 22.01.2006 03:19
Значения массива a33 PHP, PERL, MySQL, JavaScript 4 10.09.2005 21:02



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ