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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
30.05.2013, 21:04     реверсировать список байтов #1
как сделать например из 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++ Сравнение байтов в bitset
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
30.05.2013, 21:24     реверсировать список байтов #2
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
#include <iostream>
using namespace std;
 
typedef unsigned char byte;
 
void swapBytes( byte* v, size_t n )
{
   byte* in =  v;
   byte* it =  v+n-1;
   byte b;
   while (in < it)
   {
       b=*in;
       *in++=*it;
       *it--=b;
   }
} 
int main(void)
{
    byte buf[]={1,33,4,3,2,86};
    swapBytes(buf, sizeof(buf));
    for(int i=0; i < sizeof(buf); i++)
        cout << (int)buf[i] << ' ';
    cout << endl;
    return 0;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
30.05.2013, 21:27     реверсировать список байтов #3
C++
1
2
3
4
5
6
7
8
9
10
11
void swapBytes( byte* v, size_t n )
{
   byte* it =  new byte[n];
   int t = n;
   for( ;t > 0 ;--t)
   {
       it[n-t] = v[t];
   }
    delete[] v;
   v = it;
}
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
30.05.2013, 21:31     реверсировать список байтов #4
karaulov6, Кстати, не советую использовать идентификаторы in и it. У них очень осмысленный вид, мало ли, когда-то в будущем они могут стать зарезервированными словами.
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
30.05.2013, 21:42  [ТС]     реверсировать список байтов #5
Так массив байтов в
C++
1
const char *
или так должно работать?
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
30.05.2013, 21:52     реверсировать список байтов #6
Я, по-видимому, не понял ваших трудностей.
1. Что такое тип byte? Дайте определение этого типа.
2. Почему вы, обращаясь в #define к swapBytes, передаете параметр по ссылке, тогда как функция требует передачи по указателю?

Добавлено через 3 минуты
Цитата Сообщение от karaulov6 Посмотреть сообщение
бинарные данные превращаются в текст
Что вы подразумеваете под этими словами?
Цитата Сообщение от karaulov6 Посмотреть сообщение
как сделать что бы этого не происходило?
Этого сделать невозможно. Бинарные данные в любом случае могут быть интерпретированы как текст, если они представляют собой кодировку некоторых символов.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.05.2013, 21:57     реверсировать список байтов #7
zss, v локальный указатель же. ещё и выделение памяти...

Не по теме:

зачем выкладывать такой код?

karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
30.05.2013, 22:01  [ТС]     реверсировать список байтов #8
Цитата Сообщение от palva Посмотреть сообщение
Я, по-видимому, не понял ваших трудностей.
1. Что такое тип byte? Дайте определение этого типа.
2. Почему вы, обращаясь в #define к swapBytes, передаете параметр по ссылке, тогда как функция требует передачи по указателю?

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

Что вы подразумеваете под этими словами?

Этого сделать невозможно. Бинарные данные в любом случае могут быть интерпретированы как текст, если они представляют собой кодировку некоторых символов.
send (winsock2 ) принимает данные const char * , я их перехватил и мне мне нужно реверсировать("перевернуть") эти данные (и засунуть, куда-нибудь в массив байтов, без потери данных)

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
zss, v локальный указатель же. ещё и выделение памяти...

Не по теме:

зачем выкладывать такой код?

да, он и не работает по моему
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
30.05.2013, 22:08     реверсировать список байтов #9
const не имеет отношения к определению типа. Тем более, что вы хотите использовать другой тип, который вы назвали byte. В си такого типа нет. Что вы имели в виду?
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
30.05.2013, 22:10  [ТС]     реверсировать список байтов #10
ну не знаю как у вас , у меня byte=BYTE=unsigned char , просто лень капс лишний раз нажимать что бы написать BYTE
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
30.05.2013, 22:18     реверсировать список байтов #11
Цитата Сообщение от karaulov6 Посмотреть сообщение
ну не знаю как у вас
Зачем так сразу? Я написал, как у нас в сообщении #2. Наши определения совпали.
Теперь вопрос: в send вы хотите передать перевернутые данные или только
Цитата Сообщение от karaulov6 Посмотреть сообщение
засунуть, куда-нибудь в массив байтов, без потери данных
То есть, переворачивать нужно на месте или только при пересылке?
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
30.05.2013, 22:21  [ТС]     реверсировать список байтов #12
Цитата Сообщение от palva Посмотреть сообщение
Зачем так сразу? Я написал, как у нас в сообщении #2. Наши определения совпали.
Теперь вопрос: в send вы хотите передать перевернутые данные или только То есть, переворачивать нужно на месте или только при пересылке?



Мне нужно перевернуть данные , желательно что бы был к ним доступ(ну может понадобится изменить какой-нибудь байт, но это не обязательно), и потом отправить их дальше.

все готово только переворачиваться они не хотят, теряются данные, остаются только текстовые
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
30.05.2013, 22:28     реверсировать список байтов #13
Переворачиваться они не хотят, потому что у вас ошибочная функция. Зачем вы используете тип byte, тогда как вам нужен тип char ?
Для переворота можете использовать мою функцию, только замените в ней byte на char.
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
30.05.2013, 22:51  [ТС]     реверсировать список байтов #14
Цитата Сообщение от palva Посмотреть сообщение
Переворачиваться они не хотят, потому что у вас ошибочная функция. Зачем вы используете тип byte, тогда как вам нужен тип char ?
Для переворота можете использовать мою функцию, только замените в ней byte на char.


C++
1
2
3
4
            char * hello2 = "PRIVETMIR";
            MessageBox(NULL,hello2,"TEXX1",MB_OK);
            swapBytes(hello2,sizeof(hello2));
            MessageBox(NULL,hello2,"TEXX1",MB_OK);
только 1 сообщение , 2 не появилось
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
30.05.2013, 22:51     реверсировать список байтов #15
Вот так, на вскидку ответьте, чему здесь равно sizeof(hello2) ?
Второе сообщение не появилось, потому что вы передали для отображения пустую строку.
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
30.05.2013, 22:52  [ТС]     реверсировать список байтов #16
Цитата Сообщение от palva Посмотреть сообщение
Вот так, на вскидку ответьте, чему здесь равно sizeof(hello2) ?
Второе сообщение не появилось, потому что вы передали для отображения пустую строку.



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





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

А вообще, как скопировать кусок памяти (от указателя char * + len размер ) в массив байт, и потом уже этот массив перевернуть?
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
30.05.2013, 23:02     реверсировать список байтов #17
С вами трудно разговаривать. Вы не отвечаете на вопросы.
И все время получается, что я даю вам ошибочно работающий код.
Отписался от темы.
Миниатюры
реверсировать список байтов  
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
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
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
30.05.2013, 23:32     реверсировать список байтов #19
А зачем вы так написали?
Цитата Сообщение от karaulov6 Посмотреть сообщение
char * test = "PRIVETMIR";
Вот и получили. Нужно так:
C++
1
char test[] = "PRIVETMIR";
Посмотрите, как написано у меня.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 23:36     реверсировать список байтов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
30.05.2013, 23:36  [ТС]     реверсировать список байтов #20
а мне с самого начала и нужно было перевернуть char * а не char[]
Yandex
Объявления
30.05.2013, 23:36     реверсировать список байтов
Ответ Создать тему
Опции темы

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