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

Запись в фаил - C++

Восстановить пароль Регистрация
 
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
11.04.2010, 14:15     Запись в фаил #1
Здравствуйте, возник вопрос,возможно он покажется немного странным , но всё же хД

Суть такая:
нужно было придумать некий простенький алгоритм шифрования строк char, чтобы результат записывался в фаил.
Собственно я его придумал, провёл кое-какие расчёты.
12 Символьная строка шифруеться в 144 ' бита '(ну т.е. бита всмысле 144 символа 0 или 1 )
Так вот.если эти 144 записывать в фаил , то получиться ,что размер строки увеличиться в 12 раз, потому-что эти 'биты' запишуться всё равно как символы - слишком большой коэффициент увеличения =(
В то же время, если подсчитать
12 символов = 12*8 бит
144 бита = 144/8 символов = 18 символов.
То биш по идее увеличение строки всего в 1.5 раза - это уже приемимый результат.
Вот собственно вопрос.
Можно ли записать фаил таким образом , чтобы 'биты' записывались не как символы(которые весят 8 бит) а сами как биты ?


Ну если я всё правильно понимаю,если нет - поправте.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2010, 14:15     Запись в фаил
Посмотрите здесь:

Дописать фаил C++
текстовый фаил C++
фаил в функцию C++
не открывается фаил C++
Двоичный фаил C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
11.04.2010, 15:43     Запись в фаил #2
Можно конечно, но блоками по байту. Записывай в файл байт, который формируй из восьми бит.

Добавлено через 45 секунд
Помогут такие операторы, как сдвиг (>>), битовое "и" (&).
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
11.04.2010, 22:39  [ТС]     Запись в фаил #3
Спасибо )

А по подробней можно ? какими функциями пользоваться (запись\чтение) ?
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
11.04.2010, 23:59     Запись в фаил #4
Запись: fwrite;
Чтение: fread.
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
12.04.2010, 21:33  [ТС]     Запись в фаил #5
так, вроде бы разобрался.
Теперь возникли дальше вопросы.
допустим у меня есть некая переменная
C++
1
BYTE *cryptedSTR
Вот.я выделяю для неё память(исходя из поста 1)
C++
1
cryptedSTR=new BYTE[144];
Вот.А как мне следует хранить мои получившиеся биты?(144шт)
Как инт?(чтобы легко делать побитовое и\или) или как-то по- другому?
ведь у меня получиться сделать потом
C++
1
2
3
int a;
a=11111;
*scyptedSTR=a*1000;
или не получиться?
ЗЫ я этим действием хочу сделать что-то типа
C++
1
*cryptedSTR=0x11111000
т.е. это равносильно или нет?
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
12.04.2010, 22:21     Запись в фаил #6
Цитата Сообщение от GAME Посмотреть сообщение
Вот.А как мне следует хранить мои получившиеся биты?
Допустим у нас есть 4 бита. Мы их хотим "упаковать" в одну переменную.
C++
1
2
3
4
5
6
7
8
int bit[4] = {0, 1, 1, 1};
int n;
 
n = 0;
n<<=1; n+=bit[3];
n<<=1; n+=bit[2];
n<<=1; n+=bit[1];
n<<=1; n+=bit[0];
Теперь n равняется 14 в двоичной записи : 1110
C++
1
n<<=1;  // означает, что содержимое  n  сдвигается на один разряд влево
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
12.04.2010, 23:57  [ТС]     Запись в фаил #7
Спасибо большое.

А насчёт эквивалентности записей
Это одно и тоже
C++
1
2
3
int a;
a=11111;
*scyptedSTR=a*1000;
C++
1
    *cryptedSTR=0x11111000
Добавлено через 1 минуту
судя из моих экспериментов - да)

Добавлено через 1 час 18 минут
Цитата Сообщение от Alex5 Посмотреть сообщение
C++
1
n<<=1;  // означает, что содержимое  n  сдвигается на один разряд влево
блинн,либо я что-то не так делаю...но оно умножаеться на 2 а не сдвигаеться =*(
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 00:02     Запись в фаил #8
Цитата Сообщение от GAME Посмотреть сообщение
блинн,либо я что-то не так делаю...но оно умножаеться на 2 а не сдвигаеться =*(
Сдвиг влево на один бит эквивалентен умножению на 2.
Цитата Сообщение от GAME Посмотреть сообщение
C++
1
cryptedSTR=new BYTE[144];
BYTE это байт я не бит.
C++
1
2
3
4
const int bitCount  = 144;
const int bitAtByte = 8;
 
cryptedSTR = new BYTE[bitCount / bitAtByte];
Hell Knight
 Аватар для Hell Knight
230 / 84 / 3
Регистрация: 11.03.2010
Сообщений: 290
13.04.2010, 00:07     Запись в фаил #9
есть так же такой способ:
WriteFile()
юзай мсдн...
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 00:07  [ТС]     Запись в фаил #10
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Сдвиг влево на один бит эквивалентен умножению на 2.

BYTE это байт я не бит.
а
ааа
мда) пора пойти поспать)))
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 00:09     Запись в фаил #11
Цитата Сообщение от Hell Knight Посмотреть сообщение
есть так же такой способ:
WriteFile()
юзай мсдн...
А есть std::ofstream и FILE*, которые работают везде, а не только под Windows.
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
13.04.2010, 00:12     Запись в фаил #12
Цитата Сообщение от GAME Посмотреть сообщение
...но оно умножаеться на 2 а не сдвигаеться =*(
C++
1
2
3
4
5
Десятичная система    Двоичная система счисления
   3                                 00000011
   6                                 00000110
  12                                 00001100
  24                                 00011000
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
13.04.2010, 01:56     Запись в фаил #13
А зачем для 144 бит 144 байта? Достаточно ведь 18 байт. Т.к. 8 бит на байт * 18 байт = 144 бит.
C
1
2
3
4
5
...
#include <stdint.h>
...
uint8_t a[18];
...
Чтобы установить 5ый бит (считая с нуля) 6го байта (считая с нуля) в единицу:
C
1
2
3
...
a[6] |= 1 << 5;
...
Чтобы установить 3ий бит (считая с нуля) 1го байта (считая с нуля) в единицу:
C
1
2
3
...
a[1] |= 1 << 3;
...
Чтобы узнать значение 7го бита 8го байта:
C
1
2
3
...
r = (a[8] & (1 << 7))>> 7;
...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 02:06     Запись в фаил #14
Цитата Сообщение от kirjushyk Посмотреть сообщение
Чтобы установить 5ый бит (считая с нуля) 6го байта (считая с нуля) в единицу:
C++
1
a[5] |= 0x10;
Цитата Сообщение от kirjushyk Посмотреть сообщение
Чтобы установить 3ий бит (считая с нуля) 1го байта (считая с нуля) в единицу:
C++
1
a[0] |= 0x04;
Цитата Сообщение от kirjushyk Посмотреть сообщение
Чтобы узнать значение 7го бита 8го байта:
C++
1
r = a[7] & 0x40;
Без лишних сдвигов.
kirjushyk, нумерация элементов массива начинается с нуля, поэтому шестой байт это a[5], а не a[6].
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
13.04.2010, 02:48     Запись в фаил #15
Шестой байт считая с нуля (как я между прочим и указал) это как раз a[6]. Или как бы я обращался к нулевому байту (считая с нуля)? А со сдвигами я показал, чтобы понятнее было.
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 20:10  [ТС]     Запись в фаил #16
Цитата Сообщение от kirjushyk Посмотреть сообщение
А зачем для 144 бит 144 байта? Достаточно ведь 18 байт. Т.к. 8 бит на байт * 18 байт = 144 бит.

да да , это я перегрелся просто чутка)))


Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Без лишних сдвигов.
Так вот без сдвигов - то не особо.
у меня то получается вот такая тема,что биты сначала в интах храняться , и при записи....думаю просто умножать на 10 )))
или можно как - то работать сразу через 16ричную(или двоичную) С.С. ?

Добавлено через 2 часа 43 минуты
Так , возник ещё один главный вопрос.
Допустим мы всё зашифровали, записали пачками по байту.Вот.В итоге в фаиле у нас некие символы.

А как быть с обратным процессом?(расшифровкой)
Т.е. Как мне обратно разбить по битам содержимое ?????
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
13.04.2010, 20:30     Запись в фаил #17
Я уже писал, как узнать значение какого-то бита какого-то байта. Последний пример в помощь!
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 20:33  [ТС]     Запись в фаил #18
Ааааа да да, щас испытаем )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2010, 15:45     Запись в фаил
Еще ссылки по теме:

C++ Запись в фаил бОльшего числа цифр
Запись в фаил C++
C++ Сохранение в фаил

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

Или воспользуйтесь поиском по форуму:
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
20.04.2010, 15:45  [ТС]     Запись в фаил #19
я вернулся )))

Вообщем, я понял как записать\считать биты.
вот что сделал
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class N5Byte
{
    unsigned char byte;
public:
    N5Byte(){   byte=00000000;  };
    void SetBite(int index,bool value);
    void SetByte(unsigned char value);
    bool GetBite(int index);
    unsigned char GetByte();
};
 
 
void N5Byte::SetBite(int index, bool value)
{
    unsigned char tmp;
    tmp=1;
    tmp << index;
    if(value)
    {
        byte = byte | tmp;
    }
    else
    {
        tmp=~tmp;
        byte= byte & tmp;
    }
}
 
bool N5Byte::GetBite(int index)
{
    int tmp;
    tmp=1;
    tmp << index;
    tmp = byte & tmp;
    tmp >> index;
    return tmp;
}
 
unsigned char N5Byte::GetByte()
{
    return byte;
}
void N5Byte::SetByte(unsigned char value)
{
    int tmp,i;
    for(i=0;i!=8;i++)
    {
        tmp=1;
        tmp << 7-i;
        tmp = tmp & value ;
        tmp >> 7-i;
        SetBite(7-i,tmp);
        
    }
 
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    unsigned char op;
    N5Byte test,tm2;
    test.SetBite(7,1);
    cout << "\n" << test.GetBite(7);
    test.SetBite(6,0);
    cout << "\n" << test.GetBite(6);
    test.SetBite(5,0);
    cout << "\n" << test.GetBite(5);
    test.SetBite(4,1);
    cout << "\n" << test.GetBite(4);
    test.SetBite(3,0);
    cout << "\n" << test.GetBite(3);
    test.SetBite(2,1);
    cout << "\n" << test.GetBite(2);
    test.SetBite(1,0);
    cout << "\n" << test.GetBite(1);
    test.SetBite(0,1);
    cout << "\n" << test.GetBite(0);
    //op=test.GetByte();
    cout << "\n" << op << " ||  " << (op=test.GetByte());
    tm2.SetByte(op);
    cout << "\n\n\n" << test.GetBite(7);
    cout << "\n" << test.GetBite(6);
    cout << "\n" << test.GetBite(5);
    cout << "\n" << test.GetBite(4);
    cout << "\n" << test.GetBite(3);
    cout << "\n" << test.GetBite(2);
    cout << "\n" << test.GetBite(1);
    cout << "\n" << test.GetBite(0);
    getch();
 
    return 0;
}

Вобщем вот в чём проблема.
функции отвечающие за Запись битов,Получение значения бита работают нормально , также работает нормально функция возвращающая весь байт.
НО вот функция устанавливающая ВСЕЬ БАЙТ почему-то суёт 1 всезде =((((

Добавлено через 1 минуту
Попробовал также более простой вариант функции установления байта
C++
1
2
3
4
5
6
void N5Byte::SetByte(unsigned char value)
{   
    byte=00000000;
    byte = byte | value;
 
}
везде единички

Добавлено через 12 минут
Либо функция возвращающая байт неправильно работает =(

Добавлено через 11 минут
блиииин =(((( там функция сетбит тоже не работает...да что за...

Добавлено через 6 минут
так всё ясно.Это кривые первоисточники !!!! нууу!!! и отсутствие моей логики.
а именно , чтобы сдвинуть на несколько разрядов число надо было писать не
C++
1
tmp >> index
а
C++
1
tmp= tmp >> index
а так вроде всё работает пока-что))
Yandex
Объявления
20.04.2010, 15:45     Запись в фаил
Ответ Создать тему
Опции темы

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