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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 157
#1

реверсировать список байтов - C++

30.05.2013, 21:04. Просмотров 1142. Ответов 33
Метки нет (Все метки)

как сделать например из 01 02 03 04 ... это ... 04 03 02 01 ?

C++
1
2
3
4
5
6
7
8
9
10
11
void swapBytes( byte* v, size_t n )
{
   byte* in =  v;
   byte* it =  v;
   int t = n;
   for( ;t > 0 ;--t)
   {
       it[n-t] = in[t];
   }
   v = it;
}
данные const char* , но после вызова этой функции, бинарные данные превращаются в текст как сделать что бы этого не происходило?

Добавлено через 53 минуты
C++
1
#define SWAP(x) swapBytes( &x, sizeof(x) );
после вызова SWAP(const char *) в данных остается только текст и вообще они обрезаются и т.п
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2013, 21:04     реверсировать список байтов
Посмотрите здесь:

Сумма байтов C++
порядок байтов C++
Замена байтов/битов C++
C++ Неправильное выделение байтов
Порядок байтов C++
C++ Сравнение байтов в bitset
C++ Замена байтов в файле
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
2511 / 1733 / 229
Регистрация: 08.06.2007
Сообщений: 6,806
Записей в блоге: 4
30.05.2013, 23:38     реверсировать список байтов #21
Тогда и сделайте динамический массив. Какая разница. А вы сделали указатель на текстовую константу.
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 157
30.05.2013, 23:47  [ТС]     реверсировать список байтов #22
ну вот мне это и нужно перевернуть, ну то что вы назвали , const char * , т.е память размером "len" начиная с const char *



например const char *, это указатель на ( размер 5 : ) 21 22 23 24 25 , мне нужно поменять местами эти 5 байт чтобы получилось: 25 24 23 22 21



эх..., как же сложно общаться с программистами, простым смертным как я
palva
2511 / 1733 / 229
Регистрация: 08.06.2007
Сообщений: 6,806
Записей в блоге: 4
30.05.2013, 23:54     реверсировать список байтов #23
const перевернуть нельзя. На то она и константа. Делайте массив, хоть динамический, хоть какой. Его и переворачивайте.
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 157
30.05.2013, 23:57  [ТС]     реверсировать список байтов #24
ну а virtualprotect . read/write memory и т.п, не помогут?
palva
2511 / 1733 / 229
Регистрация: 08.06.2007
Сообщений: 6,806
Записей в блоге: 4
30.05.2013, 23:59     реверсировать список байтов #25
Цитата Сообщение от karaulov6 Посмотреть сообщение
ну а virtualprotect . read/write memory и т.п, не помогут?
Не понимаю о чем вы. Чему надо помочь? Разве у вас какие-то трудности?
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 157
31.05.2013, 00:08  [ТС]     реверсировать список байтов #26
C++
1
2
3
4
5
6
7
8
char * swapBytes( char* v, size_t n )
{
   char * test1 = new char[n];
   int i = 0;
   for (;i<n;i++)
   memcpy(test1+i,v+n-i,1);
   return test1;
}
ну почему бы такому коду не работать? вроде все правильно написал, только копируется пустое место

Добавлено через 3 минуты
вот это более рабочий вариант, но первая буква не копируется

C++
1
2
3
4
5
6
7
8
9
10
char * swapBytes( char* v, size_t n )
{
    byte test2 = 0x00;
    char * test1 = new char[n];
    int i = 0;
    for (;i<(int)n;i++)
    memcpy(test1+i-1,v+n-i,1);
    memcpy(test1+n,&test2,1);
    return test1;
}
palva
2511 / 1733 / 229
Регистрация: 08.06.2007
Сообщений: 6,806
Записей в блоге: 4
31.05.2013, 00:08     реверсировать список байтов #27
Этот код переворачивает данные в другое место, а исходные данные не меняются. Я же вас спрашивал про это. Но вы не стали отвечать.
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 157
31.05.2013, 00:09  [ТС]     реверсировать список байтов #28
Цитата Сообщение от palva Посмотреть сообщение
Этот код переворачивает данные в другое место, а исходные данные не меняются. Я же вас спрашивал про это. Но вы не стали отвечать.

а как вы хотели перевернуть данные никуда их не скопировав? после возвращается уже перевернутый вариант...
palva
2511 / 1733 / 229
Регистрация: 08.06.2007
Сообщений: 6,806
Записей в блоге: 4
31.05.2013, 00:12     реверсировать список байтов #29
Цитата Сообщение от karaulov6 Посмотреть сообщение
а как вы хотели перевернуть данные никуда их не скопировав?
Разве я не ответил вам, как это сделать, в первом же сообщении?
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 157
31.05.2013, 00:22  [ТС]     реверсировать список байтов #30
Цитата Сообщение от palva Посмотреть сообщение
Не понимаю о чем вы. Чему надо помочь? Разве у вас какие-то трудности?
C++
1
2
3
4
5
6
7
8
9
10
11
12
void swapBytes( char* v, size_t n )
{
    byte test2 = 0x00;
    char * test1 = new char[n];
    int i = 0;
    for (;i<(int)n;i++)
    memcpy(test1+i-1,v+n-i,1);
    DWORD test3;
    VirtualProtect(v,n,PAGE_READWRITE,&test3);
    memcpy(v,test1,n);
    VirtualProtect(v,n,test3,NULL);
}
это почти работает, только не хочет копировать первый символ подскажете решение?

Добавлено через 9 минут
Наконец что-то получилось


C++
1
2
3
4
5
6
7
8
9
10
11
12
void swapBytes( void* v, size_t n )
{
    byte * test1 = new byte[n];
    int i = 0;
    DWORD test3;
    for (;i<(int)n;i++)
        memcpy(test1+n-i-1,(byte *)v+i,1);
    VirtualProtect(v,n,PAGE_READWRITE,&test3);
    memcpy(v,test1,n);
    VirtualProtect(v,n,test3,NULL);
    delete[] test1;
}
но правильно ли я написал? (не будет сюрпризов от такого кода?)
palva
2511 / 1733 / 229
Регистрация: 08.06.2007
Сообщений: 6,806
Записей в блоге: 4
31.05.2013, 00:28     реверсировать список байтов #31
Не могу помочь. Я не знаю функции VirtualProtect. Да и не вижу нужды вникать, если есть рабочий код.
zss
Модератор
Эксперт С++
6248 / 5851 / 1891
Регистрация: 18.12.2011
Сообщений: 14,994
Завершенные тесты: 1
31.05.2013, 18:03     реверсировать список байтов #32
Цитата Сообщение от Jupiter Посмотреть сообщение
zss, v локальный указатель же. ещё и выделение памяти...
Да, действительно, сэкономить не удалось.
Придется так:
C++
1
2
3
4
5
6
7
8
9
void swapBytes( BYTE* v, size_t n )
{
   BYTE* it =  new byte[n];
   for(int t=0;t<=n-1 ;++t)
       it[n-1-t] = v[t];
   for(int t=0;t<=n-1 ;++t)
       v[t] = it[t];
   delete[] it;
}
palva
2511 / 1733 / 229
Регистрация: 08.06.2007
Сообщений: 6,806
Записей в блоге: 4
31.05.2013, 18:18     реверсировать список байтов #33
zss, на этот раз вполне корректный код, по-моему.
Правда, число пересылок здесь 2n, а у меня все же меньше – (3/2)n
Да и выделение памяти забирает здесь какую-то часть ресурсов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2013, 21:04     реверсировать список байтов
Еще ссылки по теме:

C++ Сумма байтов числа
C++ Реверсировать пять средних элементов вашего вектора
C++ Реверсировать каждое слово строки
C++ Получить число из байтов
Перестановка байтов C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.05.2013, 21:04     реверсировать список байтов #34
Цитата Сообщение от zss Посмотреть сообщение
Да, действительно, сэкономить не удалось.
C++
1
2
3
4
while ((first!=last)&&(first!=--last)) {
    std::iter_swap (first,last);
    ++first;
  }
www.cplusplus.com/reference/algorithm/reverse/
Yandex
Объявления
31.05.2013, 21:04     реверсировать список байтов
Ответ Создать тему
Опции темы

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