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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
palva
2609 / 1831 / 262
Регистрация: 08.06.2007
Сообщений: 6,989
Записей в блоге: 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
Модератор
Эксперт С++
6358 / 5922 / 1919
Регистрация: 18.12.2011
Сообщений: 15,218
Завершенные тесты: 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
2609 / 1831 / 262
Регистрация: 08.06.2007
Сообщений: 6,989
Записей в блоге: 4
30.05.2013, 21:31 #4
karaulov6, Кстати, не советую использовать идентификаторы in и it. У них очень осмысленный вид, мало ли, когда-то в будущем они могут стать зарезервированными словами.
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
30.05.2013, 21:42  [ТС] #5
Так массив байтов в
C++
1
const char *
или так должно работать?
palva
2609 / 1831 / 262
Регистрация: 08.06.2007
Сообщений: 6,989
Записей в блоге: 4
30.05.2013, 21:52 #6
Я, по-видимому, не понял ваших трудностей.
1. Что такое тип byte? Дайте определение этого типа.
2. Почему вы, обращаясь в #define к swapBytes, передаете параметр по ссылке, тогда как функция требует передачи по указателю?

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

Не по теме:

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

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

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

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

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

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

Не по теме:

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

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



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

все готово только переворачиваться они не хотят, теряются данные, остаются только текстовые
palva
2609 / 1831 / 262
Регистрация: 08.06.2007
Сообщений: 6,989
Записей в блоге: 4
30.05.2013, 22:28 #13
Переворачиваться они не хотят, потому что у вас ошибочная функция. Зачем вы используете тип byte, тогда как вам нужен тип char ?
Для переворота можете использовать мою функцию, только замените в ней byte на char.
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
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
2609 / 1831 / 262
Регистрация: 08.06.2007
Сообщений: 6,989
Записей в блоге: 4
30.05.2013, 22:51 #15
Вот так, на вскидку ответьте, чему здесь равно sizeof(hello2) ?
Второе сообщение не появилось, потому что вы передали для отображения пустую строку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 22:51
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.05.2013, 22:51
Ответ Создать тему
Опции темы

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