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

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

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

Битовый уровень C++
C++ Битовый массив (значения принимаются битами, а адресация по номеру бита)
Вектор/строка C++
C++ Реализация классов вектор и строка
C++ Битовый сдвиг
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 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
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.11.2011, 19:15     Строка -> Битовый вектор #4
да

Не по теме:

5 букв

taras atavin
Ушёл с форума.
 Аватар для 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
Ушёл с форума.
 Аватар для 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*.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2011, 01:47     Строка -> Битовый вектор
Еще ссылки по теме:

C++ Битовый сдвиг C++
Битовый сдвиг массива C++
Отсортировать большое число элементов за минимальное время, используя битовый массив C++

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

Или воспользуйтесь поиском по форуму:
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++, а задание сделать надо, и чем быстрее, тем лучше.
Yandex
Объявления
23.11.2011, 01:47     Строка -> Битовый вектор
Ответ Создать тему
Опции темы

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