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

Не записывается значение в char - C++

Восстановить пароль Регистрация
 
xKRABx
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 66
24.04.2013, 19:38     Не записывается значение в char #1
Я реализую алгоритм шифрования BlowFish, алгоритм сам по себе не очень сложный, но при попытке шифровать текст у меня возникает ошибка... Дело в том, что в ячейку char(в неё записываются зашифрованные данные) записывается одно значение(к примеру 032), но при дешифрировании программа получает из неё уже совершенно другое значение(к примеру 4294967171). Я не понимаю 2 вещи: как из 1 байта можно получить такое здоровенное число и почему он не получает исходное...
Вот часть исходного кода:

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
27
28
29
30
void encrypt(char *key, int keylength, char *data, int datalength)
{
//Здесь есть ещё код, но он не относится к проблеме и только будет мешять
 
for (int i = 0; i < datalength; i=i+8) {
    unsigned long left=0;
    unsigned long right=0;
    for(int j=0;j<4;j++) //Получаем 2 блока из 32 бит
    {
        left=(left<<8) | data[i+j];
    }
 
    for(int j=4;j<8;j++)
    {
        right=(right<<8) | data[i+j];
    }
 
    Feistel(ctx, (unsigned long*)&left, (unsigned long*)&right); //Эта функция изменяет left и right
 
    for(int j=0;j<4;j++) //Пишем
    {
        data[i+3-j]=(left>>(j) & 0xFF);
    }
 
    for(int j=0;j<4;j++)
    {
        data[i+7-j]=(right>>(j) & 0xFF);
    }
}
}
Чтобы увидеть эту проблему, я просто создал новую переменную
C++
1
unsigned long u = data[0];
и в отладчике посмотрел значение при этом значение в data[1],data[4],data[5]нормальное...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.04.2013, 21:53     Не записывается значение в char #2
Потому что преобразуете к unsigned long а char знаковый.
xKRABx
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 66
24.04.2013, 22:31  [ТС]     Не записывается значение в char #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Потому что преобразуете к unsigned long а char знаковый.
Но ведь я туда записываю коды символов, они же не могут быть отрицательные...

Добавлено через 25 минут
Да и если я использую signed long, то побитовое ИЛИ делает что-то непонятное...

А у меня с полученными значениями вот, что происходит:
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
27
28
29
30
31
unsigned long F(blowfish *ctx, unsigned long x) //Функция F
{
    return ((ctx->s[0][(x >> 24) & 0xFF] + ctx->s[1][(x >> 16) & 0xFF]) ^ ctx->s[2][(x >> 8) & 0xFF]) + ctx->s[3][(x) & 0xFF];
}
 
void Feistel(blowfish *ctx, unsigned long *left, unsigned long *right)
{
    *left ^= ctx->p[0];
    *right ^= F(ctx, *left)^ctx->p[1];
    *left ^= F(ctx, *right)^ctx->p[2];
    *right ^= F(ctx, *left)^ctx->p[3];
    *left ^= F(ctx, *right)^ctx->p[4];
    *right ^= F(ctx, *left)^ctx->p[5];
    *left ^= F(ctx, *right)^ctx->p[6];
    *right ^= F(ctx, *left)^ctx->p[7];
    *left ^= F(ctx, *right)^ctx->p[8];
    *right ^= F(ctx, *left)^ctx->p[9];
    *left ^= F(ctx, *right)^ctx->p[10];
    *right ^= F(ctx, *left)^ctx->p[11];
    *left ^= F(ctx, *right)^ctx->p[12];
    *right ^= F(ctx, *left)^ctx->p[13];
    *left ^= F(ctx, *right)^ctx->p[14];
    *right ^= F(ctx, *left)^ctx->p[15];
    *left ^= F(ctx, *right)^ctx->p[16];
    *right ^= ctx->p[17];
 
    unsigned long temp;
    temp=*right;
    *right = *left;
    *left = temp;
}
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,205
Записей в блоге: 11
24.04.2013, 22:44     Не записывается значение в char #4
Цитата Сообщение от xKRABx Посмотреть сообщение
они же не могут быть отрицательные
ASCII 8-bit использует старший разряд, для местных кодировок.
Тут будет отрицательное
C
1
char ch = 'ы';
посмотри на это.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.04.2013, 22:46     Не записывается значение в char #5
Цитата Сообщение от xKRABx Посмотреть сообщение
Но ведь я туда записываю коды символов, они же не могут быть отрицательные...
Почему Вы так считаете?
Цитата Сообщение от xKRABx Посмотреть сообщение
А у меня с полученными значениями вот, что происходит:
Что именно смущает?
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,205
Записей в блоге: 11
24.04.2013, 22:54     Не записывается значение в char #6
Цитата Сообщение от xKRABx Посмотреть сообщение
записывается одно значение(к примеру 032)
плохой пример, т.к. BlowFish шифрует строку длиной 64 бит, а значит требуется дополнение до 64 бит.
xKRABx
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 66
25.04.2013, 10:33  [ТС]     Не записывается значение в char #7
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
ASCII 8-bit использует старший разряд, для местных кодировок.
Тут будет отрицательное
C
1
char ch = 'ы';
посмотри на это.
Тогда я совсем не понимаю, как это реализовывать... Ведь я беру 4 байта, выполняю XOR с двоичным представлением элемента из 1-ой ячейки, потом сдвигаю на 1 байт влево, делаю XOR с двоичным представлением элемента из 2-ой ячейки и т.д. В итоге получаю одну переменную long, в которой в каждом байте записан код элемента. Но как это сделать, если есть отрицательные элементы?

Добавлено через 1 минуту
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
плохой пример, т.к. BlowFish шифрует строку длиной 64 бит, а значит требуется дополнение до 64 бит.
Это пример записи одного символа(взятого из зашифрованных 8 байт)в одну ячейку...

Добавлено через 10 часов 53 минуты
Ну в общем мне нужно решить 2 проблемы) Первая это записать в одну переменную размером 8 байт(long) коды 4-х символов из char, если среди них могут попасться отрицательные?
А вторую с тем, что я записываю положительный символ(например 00F7(÷)), а когда пробую прочитать, то получаю уже отрицательный символ(-9), как такое может быть? Я же пишу одно значение, но получаю уже другое...
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,205
Записей в блоге: 11
25.04.2013, 11:14     Не записывается значение в char #8
Цитата Сообщение от xKRABx Посмотреть сообщение
8 байт(long)
Где то сказано, что long 8 байт?
Цитата Сообщение от xKRABx Посмотреть сообщение
дну переменную размером 8 байт(long) коды 4-х символов из char, если среди них могут попасться отрицательные?
C
1
2
3
4
5
6
7
8
9
10
11
char* str;
//
uint8_t* data = reinterpret_cast<uint8_t>(str);
uint64_t foo = 0;
{
  uint8_t* s =  reinterpret_cast<uint8_t*> (& foo);
  s[0] = data[0];
  s[1] = data[1];
  s[2] = data[2];
  s[3] = data[3];
}
xKRABx
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 66
25.04.2013, 11:59  [ТС]     Не записывается значение в char #9
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Где то сказано, что long 8 байт?

C
1
2
3
4
5
6
7
8
9
10
11
char* str;
//
uint8_t* data = reinterpret_cast<uint8_t>(str);
uint64_t foo = 0;
{
  uint8_t* s =  reinterpret_cast<uint8_t*> (& foo);
  s[0] = data[0];
  s[1] = data[1];
  s[2] = data[2];
  s[3] = data[3];
}
Ой, я ошибся, 4 байта...

Спасибо за код Постараюсь разобраться.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.04.2013, 12:04     Не записывается значение в char #10
Цитата Сообщение от xKRABx Посмотреть сообщение
Ой, я ошибся, 4 байта...
Дело не в том, что long 4 или 8 байт. А в том, что он может быть как и 4, так и 8, и чертизнает каким еще. Это всё зависит от реализации. Чтобы быть уверенным в размере переменной нужно использовать типы из cstdint, что и продемонстрировал Dmitriy_M.
xKRABx
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 66
25.04.2013, 22:32  [ТС]     Не записывается значение в char #11
Цитата Сообщение от Tulosba Посмотреть сообщение
Дело не в том, что long 4 или 8 байт. А в том, что он может быть как и 4, так и 8, и чертизнает каким еще. Это всё зависит от реализации. Чтобы быть уверенным в размере переменной нужно использовать типы из cstdint, что и продемонстрировал Dmitriy_M.
А их лучше всегда использовать или только в крайней необходимости? Если лучше использовать, то буду вводить это в свою привычку(у меня в qt, к примеру int8, quin8 и т.п есть)).

Всем огромное спасибо за помощь и за интересную информацию, я нашёл решение и оно оказалось, что ни на есть банальным... Вместо char использовать unsigned char)
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.04.2013, 22:38     Не записывается значение в char #12
Цитата Сообщение от xKRABx Посмотреть сообщение
А их лучше всегда использовать или только в крайней необходимости?
Всегда.
xKRABx
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 66
25.04.2013, 22:49  [ТС]     Не записывается значение в char #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Всегда.
Спасибо.
А аналоги в QT qint32, quint8 и т.п это же по сути то же самое?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2013, 23:01     Не записывается значение в char
Еще ссылки по теме:

Почему в файл значение дублируется (записывается дважды)? C++
C++ В файл записывается только последнее значение
C++ В переменную массива записывается не то значение

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.04.2013, 23:01     Не записывается значение в char #14
Цитата Сообщение от xKRABx Посмотреть сообщение
А аналоги в QT qint32, quint8 и т.п это же по сути то же самое?
C Qt не работал. Но подразумеваю, что да.
Yandex
Объявления
25.04.2013, 23:01     Не записывается значение в char
Ответ Создать тему
Опции темы

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