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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Alukard_696
0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 22
#1

Строка -> Битовый вектор - C++

19.11.2011, 17:26. Просмотров 1531. Ответов 7
Метки нет (Все метки)

Вновь обращаюсь за помощью. Реализовал на C++ алгоритм блочного шифрования (SDES), использующий на входе битовые векторы длиной 8 бит. Так как шифровать им нужно текст, состоящий из цифр, букв и прочих знаков, возникает вопрос: как разбить исходное сообщение на такие векторы и как потом собрать шифротекст обратно из этих векторов в строку символов?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2011, 17:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Строка -> Битовый вектор (C++):

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

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

Битовый сдвиг в if() - C++
Обясните как работает такой код:void swap(int &a, int &b) { int temp = a; a = b; b = temp; } void...

Битовый сдвиг - C++
Вот в чем вопрос: int x = 2; int y; y = (x >> 32); cout << x << " " << y; Должен быть выход 2 0, а на экран...

Битовый уровень - C++
Сейчас в университете гоняют по задача для выполнения битовых операции и структурных операторов на битовом уровне, но я не сильно понимаю....

Класс "вектор" с конструкторами, позволяющими создать нулевой вектор и вектор с произвольным числом элементов - C++
Привет! Задача следующая. Нужно реализовать класс "вектор" с конструкторами, которые позволяют создать нулевой вектор и вектор с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.11.2011, 17:48 #2
строка из ASCII - есть символьный массив - символ(char) имеет размер один байт тобишь 8 бит
Alukard_696
0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 22
19.11.2011, 19:14  [ТС] #3
То есть можно брать по одному символу и без всяких преобразований работать с ним как с бит-вектором?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.11.2011, 19:15 #4
да

Не по теме:

5 букв

taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2011, 19:30 #5
Цитата Сообщение от Alukard_696 Посмотреть сообщение
битовые векторы длиной 8 бит.
Это называется октет, а вектор - это или stlовый массив (в программировании на плюсах), или массив, элементы которого индексируются координатными осями, или вообще лишены индексов и поименованы теми же осями (в математике, значение индекса - не координата, а сама ось), или даже матрица, у которой один размер равен единице (там же, в математике, матрица же - это в любом случае массив и не цифр). Из битой же нельзя составить массив, так как биты - это вообше не целиком данные (например, числа), а только цифры. Число может быть однозначным, но матрица всё равно не может состоять из цифр, а только из чисел, пусть и однозначных. Разобрать же любые данные на октеты можно элементарно: приведи указатель на данные к
C++
1
void *
и не мучайся. Блок, на которые будет указывать приведённый указатель, будет состоять из байтов, а на большинстве компьютеров байты равны октетам.
Alukard_696
0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 22
19.11.2011, 20:12  [ТС] #6
Спасибо.
Только если привести к неопределённому типу, как потом по одному выбирать октеты для шифрования? Допустим, будет считан из файла массив типа char с содержимым "123 Win!". Я его приведу к void и каким образом дальше с ним работать?

Сейчас нашёл пример преобразования unsigned char и char, состоящий из значений битов, но не понял принцип его работы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*Method to convert unsigned char to bit-string
  For Ex. 1="00000001"*/
void conv_to_bits(unsigned char ch)
{
    int i,bit;
    INPUT_BIT[8]='\0';
    for (i=7;i>=0;i--)
    {
        bit=ch%2;
        ch=ch/2;
 
        if (bit!=0)
            INPUT_BIT[i]='1';
        else
            INPUT_BIT[i]='0';
    } 
}
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.11.2011, 15:08 #7
Цитата Сообщение от Alukard_696 Посмотреть сообщение
Только если привести к неопределённому типу, как потом по одному выбирать октеты для шифрования?
C++
1
2
3
4
5
6
7
8
9
void *p;
void *Begin;
void *End;
Begin=(void *)&Data;
End=Begin+sizeof(Data)-1;
for (p=Begin; p<=End; ++p)
{
 //Очередной байт валяется в *p.
}
Добавлено через 9 минут
Цитата Сообщение от Alukard_696 Посмотреть сообщение
void conv_to_bits(unsigned char ch)
{
* * int i,bit;
* * INPUT_BIT[8]='\0';
* * for (i=7;i>=0;i--)
* * {
* * * * bit=ch%2;
* * * * ch=ch/2;
if (bit!=0)
* * * * * * INPUT_BIT[i]='1';
* * * * else
* * * * * * INPUT_BIT[i]='0';
* * }
}
Автор - ламер, с неупакованными битами ни кто не работает, за исключением случев массива флагов и интерфесного представления (вывод на экран и ввод с клавиатуры в двоичном формате), к тому же INPUT - это ввод, а результат. Ксорка, например, выглядит просто так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Encode(void *Data, void *key, unsigend int DataLength, unsigend int KeyLength)
{
 void *pd;
 void *pk;
 void *ed;
 void *ek;
 ed=Data+DataLenght;
 ek=Key+KeyLenght;
 for (pd=Data; pd<=ed;++pd)
 {
  for (pk=Data; (pd<=ed)&&(pk<=e;);++pd, ++pk)
  {
   *pd^=*pk;
  }
 }
}
Добавлено через 9 минут
Если шифруется всегда текст, то можно не приводить к void*, а использовать символы вместо байтов, но если шифратор универсален, то char* нежелателен по семантике задачи, так как может сбивать с толку, наводя на мысль о текстъориентированности, так как именно для текста существуют специальные шифры подмены символов, не предназначенные, а часто абсолютно не годные для кодирования иных данных и тип char* в прототипе функций шифрования/дешифрации может вызывать иллюзию такого специализированного шифра, тогда лучше void*.
Alukard_696
0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 22
23.11.2011, 01:47  [ТС] #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Ксорка, например, выглядит просто так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Encode(void *Data, void *key, unsigend int DataLength, unsigend int KeyLength)
{
 void *pd;
 void *pk;
 void *ed;
 void *ek;
 ed=Data+DataLenght;
 ek=Key+KeyLenght;
 for (pd=Data; pd<=ed;++pd)
 {
  for (pk=Data; (pd<=ed)&&(pk<=e;);++pd, ++pk)
  {
   *pd^=*pk;
  }
 }
}
По-моему, здесь есть пара ошибок. 1) Зачем складывать значение и ключ с их длинами? Мы же xor'им только данные и ключ, а длины нужны только для количества проходов цикла. 2) Разве для xor нужны два цикла? Вроде же и одного с головой хватит сделать xor двух элементов и вернуть результат.
Кстати, здесь получается, что дата xor'ится сама на себя, должна же с ключом.
Извиняюсь за такую кучу вопросов, просто очень давно не сидел за c++, а задание сделать надо, и чем быстрее, тем лучше.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2011, 01:47
Привет! Вот еще темы с ответами:

Битовый сдвиг массива - C++
Помогите разобраться с сдвигом влево (выравниванием до начала байта) данных. Задача заключается в том что есть некий массив, в котором...

Преобразование int в float (битовый перенос) - C++
Ребят, нигде в интернете не нашел ответа Битовые сдвиги с float не работают Нужно побитово перенести биты INT в float Так что бы...

Нужна подсказка про битовый ИЛИ - C++
Подскажите пожалуйста, что значит строчка &quot;min|=min;&quot;, конкретно интересует оператор |=? Заранее благодарю за ответ!

Битовый сдвиг вправо для дробных чисел - C++
(Как мне уже известно) битовый сдвиг вправо на одну &quot;ячейку&quot; аналогичен делению на 2. Например 1/2^3 или 1&gt;&gt;3. Число получается не целым,...


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

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

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