Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
NoobIsCome
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 12
#1

Разбор сложной строки с аргументами - C++

07.08.2012, 08:44. Просмотров 1432. Ответов 9
Метки нет (Все метки)

Здравствуйте друзья! Мне кажеться я заблудился в этой жизни((

В мою длл через пайп поступает строка, а точнее комманда на чтение или запись памяти

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

1 аргумент строки означает чтение или запись
2 аргумент адресс ячейки

rb = READ BYTE
wr = WRITE BYTE

пример:
"rb#0x050000,0x125" чтение байта по адресу наверно так >> ((*(ULONG_PTR*)0x050000)+0x125);
"rw#0x050000,0x125#3" запись тройки в память по адресу>> ((*(ULONG_PTR*)0x050000)+0x125);


На данный момент я смог только распознать поступившую комманду,
немогу только преобразовать 0x050000,0x125 в базовый адресс и оффсет

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            wchar_t chRequest[] = L"rb#0x050000,0x125";
            wchar_t* wpSubstring = wcstok(chRequest, L"#");
            while (wpSubstring) 
            {
                 if(wcsstr(wpSubstring,L"rb")!=0)
                 {
                     // комманда чтения байта
                    wpSubstring = wcstok(NULL, L"#");  // wpSubstring= "0x050000,0x125"
                       // тут нужно прочитать память  по адресу ((*(ULONG_PTR*)0x050000)+0x125);
                       // как преобразовать "0x050000,0x125"  в  ((*(ULONG_PTR*)0x050000)+0x125)    ???
                                                        
                    break;
                 }
                  if(wcsstr(wpSubstring,L"wb")!=0)
                 {
                    // комманда записи байта
                    // тут нужно  записать  по адресу ((*(ULONG_PTR*)0x050000)+0x125);
                    break;
                 }
              wprintf(L"-%ws-\n", wpSubstring);
              wpSubstring = wcstok(NULL, L"#");
             }

Уже третий день моих страданий(( прошу вашей помощи!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
07.08.2012, 09:02     Разбор сложной строки с аргументами #2
Поскольку формат команд известен, можно попробовать в таком духе:
C++
1
2
3
4
5
6
7
8
9
10
char chRequest[] = { "rb#0x050000,0x125" };
    char *sharp = NULL;
    unsigned int addr = 0, offs = 0;
 
    sharp = strchr(chRequest,'#');
    sscanf(sharp, "#%x,%x", &addr, &offs);
    if (strncmp(chRequest, "rb", 2) == 0)
    {
        // Чтение по адресу addr со сдвигом offs
    }
А здесь
C++
1
wpSubstring = wcstok(NULL, L"#");
видимо ошибка, нужно ведь указатель на строку передавать, а тут он передается нулевой, и соответственно результат будет так же нулевым, если совсем не отвалится
NoobIsCome
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 12
08.08.2012, 09:28  [ТС]     Разбор сложной строки с аргументами #3
Kojt , спасибо за ваш ответ!

Цитата Сообщение от Kojt Посмотреть сообщение
Поскольку формат команд известен, можно попробовать в таком духе:
C++
1
2
3
    if (strncmp(chRequest, "rb", 2) == 0)
    {
        // Чтение по адресу addr со сдвигом offs
именно чтение по адресу я не могу догнать как сделать((


Цитата Сообщение от Kojt Посмотреть сообщение
А здесь
C++
1
wpSubstring = wcstok(NULL, L"#");
видимо ошибка, нужно ведь указатель на строку передавать, а тут он передается нулевой, и соответственно результат будет так же нулевым, если совсем не отвалится
ошибки нет, wpSubstring = wcstok(NULL, L"#"); возвращает "0x050000,0x125"
вот пример wcstok(
http://www.opennet.ru/cgi-bin/openne...tok&category=3

Добавлено через 23 часа 39 минут
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
08.08.2012, 12:25     Разбор сложной строки с аргументами #4
Тема называется "Разбор сложной строки с аргументами"
Как из строки выделить команду, адрес и сдвиг было показано выше
Если нужно по адресу к памяти обращаться, дык об этом и нужно формулировать вопрос
Вообще с какой памятью работа идет? куда? зачем?
NoobIsCome
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 12
08.08.2012, 19:55  [ТС]     Разбор сложной строки с аргументами #5
Цитата Сообщение от Kojt Посмотреть сообщение
Как из строки выделить команду, адрес и сдвиг было показано выше
Если нужно по адресу к памяти обращаться, дык об этом и нужно формулировать вопрос
да, мой код в первом посте рабочий, но я разобрал не всю строку,
а конкретно не могу разложить "0x050000,0x125"

наверно я запутал вас написав много лишнего((

ВОБЩЕМ)

нада разложить строку "0x050000,0x125" (содержит два HEX значения)
на два DWORD значения.

пАмагите!!!

Добавлено через 23 минуты
или хотя-бы помогите преобразовать хекс строку "0x050000" в DWORD значение

Добавлено через 17 минут
wchar_t hexStr="0x3FA410";
DWORD hexInt;
swscanf((const wchar_t *)hexStr, "%x", &hexInt );

неработает(
Ошибка 1 error C2440: инициализация: невозможно преобразовать "const char [9]" в
Ошибка 2 error C2664: swscanf: невозможно преобразовать параметр 2 из "const char [3]" в

Добавлено через 12 минут
а вот так работает
wchar_t* hexStr=L"0x3FA410";
int hexInt;
swscanf(hexStr, L"%x", &hexInt );

жаль нельзя сообщение редактировать((

так вобщем осталось разложить строку "0x050000,0x125" на базовый и оффсет и прочитать

Добавлено через 2 часа 0 минут
все разобралсо

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Float3Writer( wchar_t chRequest[],float W)
{
           // wchar_t chRequest[] = L"0x050000,0x125";
            wchar_t* wpSubstring = wcstok(chRequest, L",");
            int BAZE=0; 
            while (wpSubstring) 
            {
                int Offset; 
                swscanf(wpSubstring, L"%x", &Offset);
                if(BAZE==0)
                {
                    BAZE=Offset;
                }
                else
                {
                    BAZE=(*(DWORD*)(BAZE)+Offset);
                }
                wpSubstring = wcstok(NULL, L",");
             }
            *(float*)(BAZE)=W;
}
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.08.2012, 20:57     Разбор сложной строки с аргументами #6
NoobIsCome, не вполне понял логику вашего решения. Вы что, тупо читаете все символы до и после запятой?... А зачем вам float на выходе?

Я бы сделал так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
#include <wchar.h>
 
/*
 * Определяем структуру команды
 */
 
#define COMMAND_ERROR 0
#define COMMAND_READ  1
#define COMMAND_WRITE 2
 
typedef
struct
{
    char command;
    unsigned address, offset;
}
command_t;
 
 
/*
 * Функция для разбора строки команды
 *
 * str - строка команды
 * ret - выходная структура
 *
 * возвращает:
 *    0 - в случае успеха
 *    не 0 - в случае ошибки
 *
 * формат строки команды:
 *    [cmd]#[addr],[offset]
 *        cmd - rb или wb
 *        addr - адрес в hex
 *        offset - смещение в hex
 *
 */
 
int
string_to_command( const wchar_t * str, command_t * ret )
{
    size_t sharp_pos = 0;
    wchar_t * sharp_ptr;
 
    if( NULL == ( sharp_ptr = wcschr( str, L'#' ) ) )
    {
        fputs( "Cannot find #\n", stderr );
        return 1;
    }
 
    sharp_pos = ( sharp_ptr - str ) / sizeof( wchar_t );
 
    if( 0 == wcsncmp( L"rb", str, sharp_pos ) )
        ret->command = COMMAND_READ;
    else if( 0 == wcsncmp( L"wb", str, sharp_pos ) )
        ret->command = COMMAND_WRITE;
    else
    {
        fputs( "Bad command", stderr );
        return 1;
    }
 
    if( 2 != swscanf( sharp_ptr + 1, L"%x,%x", &( ret->address ), &( ret->offset ) ) )
    {
        fputs( "Bad addr", stderr );
        return 1;
    }
 
    return 0;
}
 
 
 
/*
 * Проверяем
 */
 
int
main()
{
#define INPUT_STRING_LENGTH 256
    wchar_t input_string [ INPUT_STRING_LENGTH ];
 
    fputs( " > ", stdout );
 
    if( 0 == fgetws( input_string, INPUT_STRING_LENGTH, stdin )
            && ferror( stdin ) )
    {
        perror( "input" );
        return 1;
    }
 
    command_t input_command;
 
    if( 0 != string_to_command( input_string, &input_command ) )
    {
        return 1;
    }
 
    if( input_command.command == COMMAND_READ )
        printf( "CMD: read from %08x:%08x\n", input_command.address, input_command.offset );
    else if( input_command.command == COMMAND_WRITE )
        printf( "CMD: write to %08x:%08x\n", input_command.address, input_command.offset );
    else
    {
        fputs( "CMD: unknown\n", stderr );
        return 1;
    }
 
    return 0;
}
Добавлено через 1 минуту
И ещё: почему wchar_t?
NoobIsCome
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 12
08.08.2012, 22:23  [ТС]     Разбор сложной строки с аргументами #7
Цитата Сообщение от talis Посмотреть сообщение
NoobIsCome, не вполне понял логику вашего решения. Вы что, тупо читаете все символы до и после запятой?... А зачем вам float на выходе?
там строка разбиваеться на элементы и разделителем служить запятая
по адресу 0x050000 читаеться другой адрес к которому прибавляеться
0x125 и в получившийся адрес записываеться float значение
(float по тому-что тестировал спидхак в игре)
,а там еще всякие байты инты даблы отдельно ипсать буду.


Цитата Сообщение от talis Посмотреть сообщение
И ещё: почему wchar_t?
А у меня строка поступает из пайпа , который в майкрософтовском примере читает именно в wchar_t.
и я решил не менять на char (мало-ли что), сложно у вас тут в с++
(я на C# пишу - там и обезьяна код напишет, но длл'ки на дотнете плохо инжектятся кхее кхее)) ),
а вот поэтому с плюсами маюсь(.

Спасибо за ваш пример, наверно стырю у вас некоторые строчки)
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.08.2012, 19:31     Разбор сложной строки с аргументами #8
You're welcome ;-)

Цитата Сообщение от NoobIsCome Посмотреть сообщение
сложно у вас тут в с++

Не по теме:

Это был C. На плюсах попроще.

NoobIsCome
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 12
10.08.2012, 08:28  [ТС]     Разбор сложной строки с аргументами #9
странно, у мелкософта написано что это с++ примерчики
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2012, 09:37     Разбор сложной строки с аргументами
Еще ссылки по теме:

C++ Разбор строки
C++ Работа с аргументами ф-й в С++
C++ Работа с аргументами
C++ Разбор командной строки\Вывод в файл координат
C++ Разбор строки через цикл

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
10.08.2012, 09:37     Разбор сложной строки с аргументами #10
Еще раз с камментами
C++
1
2
3
4
5
6
7
8
9
10
11
12
char chRequest[] = { "rb#0x050000,0x125" }; // инициализируем строку
    char *sharp = NULL; // указатель на символ разделитель # который будем искать в строке
    unsigned int addr = 0, offs = 0; // Переменные, куда сложим извлеченные из строки запроса адрес и сдвиг
 
    sharp = strchr(chRequest,'#'); // Находим в строке # и запоминаем указатель на этот символ (если будем обращаться к строке по указателю sharp получим подстроку #0x050000,0x125)
    sscanf(sharp, "#%x,%x", &addr, &offs); // Разбираем строку которая начинается с указателя sharp, значения адреса и сдвига складываем в соответствующие переменные
    if (strncmp(chRequest, "rb", 2) == 0) // сравниваем первые два символа строки
    {
        // Чтение по адресу addr со сдвигом offs
        // В переменных addr и offs лежат уже распарсенные данные
        // это числа
    }
Строка парсится, опять же рекомендую читать справочник по С++ до просветления
Yandex
Объявления
10.08.2012, 09:37     Разбор сложной строки с аргументами
Ответ Создать тему
Опции темы

Текущее время: 09:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru