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

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

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

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

30.05.2013, 21:04. Просмотров 1162. Ответов 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++
Вообще никак не получается. Кто может подсказать, как это сделать? Есть вариант решения, но мне не подходит: // 5 задание.cpp:...

Реверсировать пять средних элементов вашего вектора - C++
Помогите с заданием. В STL имеется алгоритм void reverse( Iterator _First, Iterator _Last ), который можно применять к контейнерами с...

Чтение байтов - C++
Ребят, здравствуйте , nомогите разобраться , есть бинарный файл , в нем данные заnисанные в структурах , и в файле 1-е 4 байта это кол-во...

Сумма байтов - C++
Всем доброго времени суток. Помогите пожалуйста. У меня задание: вычислить контрольную сумму последовательности байтов, ограниченной двумя...

Перестановка байтов - C++
Задание: Определить объединение из двух полей. Первое поле - массив из 4 байт, второе двойное слово. Ввести случайное целое число в...

порядок байтов - C++
Подскажите, пожалуйста, как записать целое число в битовый файл, чтобы на всех машинах оно считывалось бы с одинаковым порядком байт.

Порядок байтов - C++
Заранее извиняюсь если не туда пишу... Помогите определить порядок байтов: 01 00 00 00 71 82 3D 00 CB 82 3D 00 ED 68 4C 23...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
30.05.2013, 22:52  [ТС]     реверсировать список байтов #16
Цитата Сообщение от palva Посмотреть сообщение
Вот так, на вскидку ответьте, чему здесь равно sizeof(hello2) ?
Второе сообщение не появилось, потому что вы передали для отображения пустую строку.



а я писал и 9 вместо sizeof , то же самое





Добавлено через 10 минут

А вообще, как скопировать кусок памяти (от указателя char * + len размер ) в массив байт, и потом уже этот массив перевернуть?
palva
2595 / 1817 / 260
Регистрация: 08.06.2007
Сообщений: 6,964
Записей в блоге: 4
30.05.2013, 23:02     реверсировать список байтов #17
С вами трудно разговаривать. Вы не отвечаете на вопросы.
И все время получается, что я даю вам ошибочно работающий код.
Отписался от темы.
Миниатюры
реверсировать список байтов  
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
30.05.2013, 23:10  [ТС]     реверсировать список байтов #18
Цитата Сообщение от palva Посмотреть сообщение
что я даю вам ошибочно работающий код.
ну так получается что ваш код у меня не хочет работать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void swapBytes( char* v, size_t n )
{
   char* in =  v;
   char* it =  v+n-1;
   char b;
   while (in < it)
   {
       b=*in;
       *in++=*it;
       *it--=b;
   }
} 
 
 
int main (void)
{
    char * test = "PRIVETMIR";
    MessageBox(NULL,test,"TEST1",MB_OK);
    swapBytes(test,9);
    MessageBox(NULL,test,"TEST1",MB_OK);
    system("pause");
    return 0;
}

1 сообщение появилось, 2 сообщение:
Миниатюры
реверсировать список байтов  
palva
2595 / 1817 / 260
Регистрация: 08.06.2007
Сообщений: 6,964
Записей в блоге: 4
30.05.2013, 23:32     реверсировать список байтов #19
А зачем вы так написали?
Цитата Сообщение от karaulov6 Посмотреть сообщение
char * test = "PRIVETMIR";
Вот и получили. Нужно так:
C++
1
char test[] = "PRIVETMIR";
Посмотрите, как написано у меня.
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
30.05.2013, 23:36  [ТС]     реверсировать список байтов #20
а мне с самого начала и нужно было перевернуть char * а не char[]
palva
2595 / 1817 / 260
Регистрация: 08.06.2007
Сообщений: 6,964
Записей в блоге: 4
30.05.2013, 23:38     реверсировать список байтов #21
Тогда и сделайте динамический массив. Какая разница. А вы сделали указатель на текстовую константу.
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
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
2595 / 1817 / 260
Регистрация: 08.06.2007
Сообщений: 6,964
Записей в блоге: 4
30.05.2013, 23:54     реверсировать список байтов #23
const перевернуть нельзя. На то она и константа. Делайте массив, хоть динамический, хоть какой. Его и переворачивайте.
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
30.05.2013, 23:57  [ТС]     реверсировать список байтов #24
ну а virtualprotect . read/write memory и т.п, не помогут?
palva
2595 / 1817 / 260
Регистрация: 08.06.2007
Сообщений: 6,964
Записей в блоге: 4
30.05.2013, 23:59     реверсировать список байтов #25
Цитата Сообщение от karaulov6 Посмотреть сообщение
ну а virtualprotect . read/write memory и т.п, не помогут?
Не понимаю о чем вы. Чему надо помочь? Разве у вас какие-то трудности?
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
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
2595 / 1817 / 260
Регистрация: 08.06.2007
Сообщений: 6,964
Записей в блоге: 4
31.05.2013, 00:08     реверсировать список байтов #27
Этот код переворачивает данные в другое место, а исходные данные не меняются. Я же вас спрашивал про это. Но вы не стали отвечать.
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
31.05.2013, 00:09  [ТС]     реверсировать список байтов #28
Цитата Сообщение от palva Посмотреть сообщение
Этот код переворачивает данные в другое место, а исходные данные не меняются. Я же вас спрашивал про это. Но вы не стали отвечать.

а как вы хотели перевернуть данные никуда их не скопировав? после возвращается уже перевернутый вариант...
palva
2595 / 1817 / 260
Регистрация: 08.06.2007
Сообщений: 6,964
Записей в блоге: 4
31.05.2013, 00:12     реверсировать список байтов #29
Цитата Сообщение от karaulov6 Посмотреть сообщение
а как вы хотели перевернуть данные никуда их не скопировав?
Разве я не ответил вам, как это сделать, в первом же сообщении?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2013, 00:22     реверсировать список байтов
Еще ссылки по теме:

Сумма байтов числа - C++
Написать функцию, принимающую указатель на вещественную переменную типа float и возвращающую сумму составляющих это вещественное число...

Неправильное выделение байтов - C++
void *_upointer; int type:2; В классе присутствуют 2 переменные. Насколько я знаю, указатель занимает 4 байта, а int в данном случае...

Задать порядок байтов - C++
Нет ли в C++ какого-то штатного средства, позволяющего преобразовать порядок байт числа в &quot;от старшего к младшему&quot;? Понятно, что...

Замена байтов/битов - C++
Здравствуйте. Помогите пожалуйста написать программу: нужно ввести последовательность из 8 целых чисел. Если число четное, то заменить его...

Получить число из байтов - C++
добрый день, получаю байты числа вот так: int number; int bytes; cin&gt;&gt;number; bytes=(number&amp;0x000000FF); ...


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

Или воспользуйтесь поиском по форуму:
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
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;
}
но правильно ли я написал? (не будет сюрпризов от такого кода?)
Yandex
Объявления
31.05.2013, 00:22     реверсировать список байтов
Ответ Создать тему
Опции темы

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