Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шифрование файлов, метод сдвигом 
V
    Опции темы
FreeJaile
Дата 10.6.2009, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Здравствуйте. У меня возникла проблема при преобразовании символа в ASCII-код.
А именно: мне нужно прочитать первый символ из файла, не изменяя его записать в другой. И на основе кода этого первого символа определить размер сдвига k. И ещё возник вопрос, как лучше проверить, не выходит ли значение кода за допустимые 0 и 256.

Код

int crypt (char *file1,char *file2){
    char ch[80];
    int i,length,k;

    ifstream to_crypt(file1); //то что нужно шифровать
    if (to_crypt.fail())
        return 1;
    

    ofstream crypted(file2); //куда шифруем
    if (crypted.fail())
        return 1;

    to_crypt>>ch[0];
    crypted<<ch[0];
    k =(int)ch[0]+3; //здесь почему-то преобразует правильно не все символы

    while (to_crypt.eof()==0){ 
        for(i=0;i<80 && !to_crypt.eof();i++)
            to_crypt.get(ch[i]);
        length=i;
        for(i=1;i<length;i++){
            ch[i]+=k;
            crypted<<ch[i];
        }
    } 
    to_crypt.close();
    crypted.close();
    return 0;
} 

PM MAIL   Вверх
jonie
Дата 10.6.2009, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата
не выходит ли значение кода за допустимые 0 и 256.

8 бит всегда принимают значения [0,255]. Для обрезки int до байта можно использовать операцию AND: n&0xFF  - оставит один байт.

Цитата
k =(int)ch[0]+3; //здесь почему-то преобразует правильно не все символы

ну так если ch[0] = 0xFF, тогда его сложение с 1 например даст младший байт равный = 0х00, в чем неправильность?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
FreeJaile
Дата 10.6.2009, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



неправильность в том, что у меня есть символы (я работаю с текстовыми файлами). И я проверяла, какие там коды получаются: из 4-х один символ преобразуется неправильно (для буквы а показывает код -32)
PM MAIL   Вверх
azesmcar
Дата 10.6.2009, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



FreeJaile
немного критики, надеюсь не возражаете.
почему функция возвращяет int а не bool?
почему функция принимает неконстантный указатель на char?
цикл написано очень непонятно, зачем вообще этот массив char ch[80]?

Цитата(FreeJaile @  10.6.2009,  07:20 Найти цитируемый пост)
неправильность в том, что у меня есть символы (я работаю с текстовыми файлами). И я проверяла, какие там коды получаются: из 4-х один символ преобразуется неправильно (для буквы а показывает код -32) 

ну и что? приведите к unsigned char - результат будет другой. А символ - один и тот же - 0хE0.

вот вам пример, разбирайте.
Код

struct crypt_functor : binary_function<char, char, char>
{
    char operator ()(char p, char key) const
    {
        return p + key + 3;
    }
};

bool crypt(const char* f_inp, const char* f_out)
{
    ifstream inp(f_inp);
    ofstream out(f_out);

    if (!inp.is_open() || !out.is_open())
        return false;

    std::transform(
        std::istream_iterator<char>(inp >> noskipws),
        std::istream_iterator<char>(),
        std::ostream_iterator<char>(out),
        std::bind2nd(crypt_functor(), inp.peek()));

    return true;
} 


Это сообщение отредактировал(а) azesmcar - 10.6.2009, 08:47
PM   Вверх
FreeJaile
Дата 10.6.2009, 21:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



спасибо, такая критика никогда не бывает лишней))
тогда ещё пару вопросов: 
в чем полезность константных указателей на char, 
что такое bind2nd 
и зачем нам вот это struct crypt_functor : binary_function<char, char, char>?
PM MAIL   Вверх
andrew_121
Дата 10.6.2009, 22:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(FreeJaile @  10.6.2009,  21:49 Найти цитируемый пост)
в чем полезность константных указателей на char

В том, чтоб ты не посмел их изменять.


Цитата(FreeJaile @  10.6.2009,  21:49 Найти цитируемый пост)
что такое bind2nd 

http://www.cplusplus.com/reference/std/functional/bind2nd/


Цитата(FreeJaile @  10.6.2009,  21:49 Найти цитируемый пост)
и зачем нам вот это struct crypt_functor

Этот объект применяется к каждому элементу. Путем вызова operator() ()


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
jonie
Дата 10.6.2009, 22:13 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

в чем полезность константных указателей на char

это вопрос культуры программирования - вы же не один в будущем программировать будете, и возможно ваши функции будет использовать еще кто-то, и ему очень не захочется лезть и разбираться может ли ваша функция испортить его буферы.

Цитата

что такое bind2nd 

http://www.cplusplus.com/reference/std/functional/bind2nd/
функция для "приведения" бинарной функции в унарную форму через фиксирование второго параметра заданному значению.

Цитата
и зачем нам вот это struct crypt_functor : binary_function<char, char, char>?

это собственно сам криптоалгоритм. грубо говоря вот это:
Код
std::transform(
        std::istream_iterator<char>(inp >> noskipws),
        std::istream_iterator<char>(),
        std::ostream_iterator<char>(out),
        std::bind2nd(crypt_functor(), inp.peek()));

сделает следующее: для каждого входного байта из inp, будет вызвана crypt_functor.operator() c вторым параметром равным inp.peek() и первым параметром равным текущему байту, после чеге результат отправится в out ( ? используя out.push_back ?).

inp.peek()  берет следующий байт из stream, без сдвига внутреннего итератора, указывающего на текущее положение в stream-е.


Это сообщение отредактировал(а) jonie - 10.6.2009, 22:14


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
zim22
Дата 11.6.2009, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(andrew_121 @  10.6.2009,  22:02 Найти цитируемый пост)
Цитата(FreeJaile @  10.6.2009,  21:49 )в чем полезность константных указателей на charВ том, чтоб ты не посмел их изменять.

смотря что понимать под "изменением"

есть аж 4 вида "извращений":
1) неконстантный указатель на неконстантные данные           (char * p)
2) неконстантный указатель на константные данные               (const char * p)
3) константный указатель на константные данные                   (const char * const p)
4) константный указатель на неконстантные данные               (char * const p)


--------------------
PM MAIL   Вверх
FreeJaile
Дата 20.6.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



А если так оставить, как вы думаете, не слишком позорно?

Код

unsigned char crypt_key(char p, char key){
    return p+key+3;
}

bool crypt (const char *file1, const char *file2){
    char key, p;
    unsigned char k;
    ifstream to_crypt(file1); //то что нужно шифровать
    if (to_crypt.fail())return false;
    
    ofstream crypted(file2); //куда шифруем
    if (crypted.fail()) return false;

    to_crypt >> key;
    crypted << key;

    while(to_crypt){
        to_crypt >> noskipws;
        to_crypt >> p;
        k = crypt_key(p,key);
        crypted<<k;
    }
    return true;
}

unsigned char decrypt_key(char p, char key){
    return p-key-3;
}

bool decrypt (const char *file1, const char *file2){
    char key, p;
    unsigned char k;
    ifstream to_decrypt(file1); //то что нужно шифровать
    if (to_decrypt.fail())return false;
    
    ofstream decrypted(file2); //куда шифруем
    if (decrypted.fail()) return false;

    to_decrypt >> key;
    decrypted << key;

    while(to_decrypt){
        to_decrypt >> noskipws;
        to_decrypt >> p;
        k = decrypt_key(p,key);
        decrypted<<k;
    }
    return true;
}


PM MAIL   Вверх
Леопольд
Дата 20.6.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(FreeJaile @ 20.6.2009,  14:05)
А если так оставить, как вы думаете, не слишком позорно?

Для ВУЗа лучше подойдёт.

Это сообщение отредактировал(а) Леопольд - 20.6.2009, 18:54


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0681 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.