Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
1

Запись в фаил

11.04.2010, 14:15. Показов 1172. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, возник вопрос,возможно он покажется немного странным , но всё же хД

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


Ну если я всё правильно понимаю,если нет - поправте.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2010, 14:15
Ответы с готовыми решениями:

Запись в фаил
Подскажите как осуществить запись в фаил определенным шрифтом, например шрифтом Arial или Calibri...

Запись в фаил бОльшего числа цифр
Подскажите пожалуйста, что нужно использовать для того, чтобы записать в фаил число с большим...

запись в фаил
2 функции , условие и запись в фаил , функции отдают переменную $mytext; но кусок кода отвечающий...

Запись в фаил c#
Пишу программу (утилиту) Хочу чтобы при нажатии на кнопку в фаил HOSTS добавлялся вредноносный сайт...

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

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

А по подробней можно ? какими функциями пользоваться (запись\чтение) ?
0
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
11.04.2010, 23:59 4
Запись: fwrite;
Чтение: fread.
1
23 / 23 / 5
Регистрация: 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
т.е. это равносильно или нет?
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
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  сдвигается на один разряд влево
1
23 / 23 / 5
Регистрация: 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 а не сдвигаеться =*(
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 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];
0
230 / 60 / 17
Регистрация: 11.03.2010
Сообщений: 294
13.04.2010, 00:07 9
есть так же такой способ:
WriteFile()
юзай мсдн...
0
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 00:07  [ТС] 10
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Сдвиг влево на один бит эквивалентен умножению на 2.

BYTE это байт я не бит.
а
ааа
мда) пора пойти поспать)))
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 00:09 11
Цитата Сообщение от Hell Knight Посмотреть сообщение
есть так же такой способ:
WriteFile()
юзай мсдн...
А есть std::ofstream и FILE*, которые работают везде, а не только под Windows.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
13.04.2010, 00:12 12
Цитата Сообщение от GAME Посмотреть сообщение
...но оно умножаеться на 2 а не сдвигаеться =*(
C++
1
2
3
4
5
Десятичная система    Двоичная система счисления
   3                                 00000011
   6                                 00000110
  12                                 00001100
  24                                 00011000
0
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;
...
1
Эксперт С++
2347 / 1720 / 148
Регистрация: 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].
1
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
13.04.2010, 02:48 15
Шестой байт считая с нуля (как я между прочим и указал) это как раз a[6]. Или как бы я обращался к нулевому байту (считая с нуля)? А со сдвигами я показал, чтобы понятнее было.
0
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 20:10  [ТС] 16
Цитата Сообщение от kirjushyk Посмотреть сообщение
А зачем для 144 бит 144 байта? Достаточно ведь 18 байт. Т.к. 8 бит на байт * 18 байт = 144 бит.

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


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

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

А как быть с обратным процессом?(расшифровкой)
Т.е. Как мне обратно разбить по битам содержимое ?????
0
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
13.04.2010, 20:30 17
Я уже писал, как узнать значение какого-то бита какого-то байта. Последний пример в помощь!
1
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 20:33  [ТС] 18
Ааааа да да, щас испытаем )
0
23 / 23 / 5
Регистрация: 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
а так вроде всё работает пока-что))
0
20.04.2010, 15:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2010, 15:45
Помогаю со студенческими работами здесь

Запись в фаил
Доброе время суток. Появилась при написании примера с книги появился вопрос. привожу пример. ...

фаил типа запись..
мне надо из stringgrid считать информацию в фаил записей.. в программирование новичок......

Удалёная запись в фаил.
Добрый День! Возник вопрос как можно из текст бокса записать в текстовый фаил находящийся на...

Запись данных в конфигурационный фаил
По подсказке уважаемых форумчан, считываю данные из конфигурационного фаила так ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru