Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > unsigned char to char


Автор: Belous 10.2.2017, 23:08
Вопрос появился в связи со следующим.
Есть текстовый файл. Данные из которого я считываю и получаю строки как массивы char.
Но для того, чтобы пользователь не мог править файл по своему усмотрению, желательно его зашифровать хотя бы простеньким xor. 

Например мне нужно 
1. прочитать данные из файла
2. использовать функцию EncodingDdecoding()
3. перевести массив unsigned char в массив char, чтобы получить текст.


1-> считываю данные файла побайтно, (насколько я понимаю byte в С++ это и есть unsigned char)
Код

int i;
char str[100];
unsigned char ustr[100];
FILE *file;
if ((file = fopen(filename, "r+b")) != NULL)
{
    for (i=0; i<1; i++)
    {
        fread(ustr, sizeof(unsigned char), 100, file);
        if (feof(file)) break;
    }
    fclose(file);
}

2-> использовать функцию EncodingDdecoding()
Код

void EncodingDdecoding (unsigned char *input, unsigned char *output, int len) 
{
//...
}

3-> а вот здесь вопрос ?

Код

strcpy(str, (char*) ustr); // <-- ошибка





Автор: Belous 10.2.2017, 23:59
PS у меня в отличие от тех решений, которые нахожу в интернете не создается другой (зашифрованный или расшифрованный) файл. В рамках моей задачи этого во-первых не нужно. А во-вторых создать второй файл а затем удалить - это как-то не спортивно.

Автор: azesmcar 11.2.2017, 00:10
если пишешь на C++, то лучше использовать его возможности, а не путаться в сишных fopen -ах.
вот пример. меняй по вкусу.
Код

#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <iterator>

int main()
{
    std::string encoded;
    std::string decoded;

    std::ifstream fin("test.txt");
    fin >> std::noskipws;

    std::transform(
        std::istream_iterator<char>(fin),
        std::istream_iterator<char>(),
        std::back_inserter(encoded),
        std::bind(std::plus<char>(), std::placeholders::_1, 1));

    std::transform(
        encoded.begin(),
        encoded.end(), 
        std::back_inserter(decoded),
        std::bind(std::minus<char>(), std::placeholders::_1, 1));

    std::cout << encoded << std::endl;
    std::cout << decoded << std::endl;
}

Автор: Belous 11.2.2017, 00:54
<удалено>

Автор: azesmcar 11.2.2017, 10:43
Belous, signed тип использует один бит для хранения знака для отрицательного или положительного числа, а unsigned тип использует этот бит для хранения самого числа. В этом причина того, что unsigned тип может хранить вдвое больше, но в данном случае тебе нужен просто char. ASCII таблица в char помещается.

Автор: Belous 11.2.2017, 10:47
Решил сделать по вашему примеру.

Спасибо

Автор: volatile 11.2.2017, 12:12
Цитата(Belous @  10.2.2017,  23:08 Найти цитируемый пост)
strcpy(str, (char*) ustr); // <-- ошибка

Здесь нет ошибки, походу у вас ошибка была где-то в другом месте

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)