Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

30.05.2013, 21:04. Просмотров 1220. Ответов 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 *) в данных остается только текст и вообще они обрезаются и т.п
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2013, 21:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос реверсировать список байтов (C++):

Реверсировать каждое слово строки - C++
Вообще никак не получается. Кто может подсказать, как это сделать? Есть вариант решения, но мне не подходит: // 5 задание.cpp:...

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

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

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

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

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

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



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





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

А вообще, как скопировать кусок памяти (от указателя char * + len размер ) в массив байт, и потом уже этот массив перевернуть?
0
palva
2771 / 1997 / 316
Регистрация: 08.06.2007
Сообщений: 7,339
Записей в блоге: 4
30.05.2013, 23:02 #17
С вами трудно разговаривать. Вы не отвечаете на вопросы.
И все время получается, что я даю вам ошибочно работающий код.
Отписался от темы.
0
Миниатюры
реверсировать список байтов  
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
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 сообщение:
0
Миниатюры
реверсировать список байтов  
palva
2771 / 1997 / 316
Регистрация: 08.06.2007
Сообщений: 7,339
Записей в блоге: 4
30.05.2013, 23:32 #19
А зачем вы так написали?
Цитата Сообщение от karaulov6 Посмотреть сообщение
char * test = "PRIVETMIR";
Вот и получили. Нужно так:
C++
1
char test[] = "PRIVETMIR";
Посмотрите, как написано у меня.
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
30.05.2013, 23:36  [ТС] #20
а мне с самого начала и нужно было перевернуть char * а не char[]
0
palva
2771 / 1997 / 316
Регистрация: 08.06.2007
Сообщений: 7,339
Записей в блоге: 4
30.05.2013, 23:38 #21
Тогда и сделайте динамический массив. Какая разница. А вы сделали указатель на текстовую константу.
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
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



эх..., как же сложно общаться с программистами, простым смертным как я
0
palva
2771 / 1997 / 316
Регистрация: 08.06.2007
Сообщений: 7,339
Записей в блоге: 4
30.05.2013, 23:54 #23
const перевернуть нельзя. На то она и константа. Делайте массив, хоть динамический, хоть какой. Его и переворачивайте.
1
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
30.05.2013, 23:57  [ТС] #24
ну а virtualprotect . read/write memory и т.п, не помогут?
0
palva
2771 / 1997 / 316
Регистрация: 08.06.2007
Сообщений: 7,339
Записей в блоге: 4
30.05.2013, 23:59 #25
Цитата Сообщение от karaulov6 Посмотреть сообщение
ну а virtualprotect . read/write memory и т.п, не помогут?
Не понимаю о чем вы. Чему надо помочь? Разве у вас какие-то трудности?
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
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;
}
0
palva
2771 / 1997 / 316
Регистрация: 08.06.2007
Сообщений: 7,339
Записей в блоге: 4
31.05.2013, 00:08 #27
Этот код переворачивает данные в другое место, а исходные данные не меняются. Я же вас спрашивал про это. Но вы не стали отвечать.
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
31.05.2013, 00:09  [ТС] #28
Цитата Сообщение от palva Посмотреть сообщение
Этот код переворачивает данные в другое место, а исходные данные не меняются. Я же вас спрашивал про это. Но вы не стали отвечать.

а как вы хотели перевернуть данные никуда их не скопировав? после возвращается уже перевернутый вариант...
0
palva
2771 / 1997 / 316
Регистрация: 08.06.2007
Сообщений: 7,339
Записей в блоге: 4
31.05.2013, 00:12 #29
Цитата Сообщение от karaulov6 Посмотреть сообщение
а как вы хотели перевернуть данные никуда их не скопировав?
Разве я не ответил вам, как это сделать, в первом же сообщении?
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
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;
}
но правильно ли я написал? (не будет сюрпризов от такого кода?)
0
31.05.2013, 00:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2013, 00:22
Привет! Вот еще темы с ответами:

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

Перевод байтов в число - C++
Добрый день! Написал небольшую программу для связи с прибором через сом порт. Прибор измеряет силу тока и передает данные через СОМ порт...

Замена байтов в файле - C++
Есть программа написанная на MFC, вопрос как можно реализовать смену байтов в файле который она открывает если я знаю офсеты 0x000C92AE и...

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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