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

Запись в фаил

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

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

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


Ну если я всё правильно понимаю,если нет - поправте.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.04.2010, 14:15
Ответы с готовыми решениями:

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

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

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

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

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

А по подробней можно ? какими функциями пользоваться (запись\чтение) ?
0
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
11.04.2010, 23:59
Запись: fwrite;
Чтение: fread.
1
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
12.04.2010, 21:33  [ТС]
так, вроде бы разобрался.
Теперь возникли дальше вопросы.
допустим у меня есть некая переменная
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
Цитата Сообщение от 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
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
12.04.2010, 23:57  [ТС]
Спасибо большое.

А насчёт эквивалентности записей
Это одно и тоже
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
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 00:02
Цитата Сообщение от 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
 Аватар для Hell Knight
230 / 60 / 17
Регистрация: 11.03.2010
Сообщений: 294
13.04.2010, 00:07
есть так же такой способ:
WriteFile()
юзай мсдн...
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 00:07  [ТС]
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Сдвиг влево на один бит эквивалентен умножению на 2.

BYTE это байт я не бит.
а
ааа
мда) пора пойти поспать)))
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 00:09
Цитата Сообщение от Hell Knight Посмотреть сообщение
есть так же такой способ:
WriteFile()
юзай мсдн...
А есть std::ofstream и FILE*, которые работают везде, а не только под Windows.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
13.04.2010, 00: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
А зачем для 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
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 02:06
Цитата Сообщение от 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
Шестой байт считая с нуля (как я между прочим и указал) это как раз a[6]. Или как бы я обращался к нулевому байту (считая с нуля)? А со сдвигами я показал, чтобы понятнее было.
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 20:10  [ТС]
Цитата Сообщение от 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
Я уже писал, как узнать значение какого-то бита какого-то байта. Последний пример в помощь!
1
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 20:33  [ТС]
Ааааа да да, щас испытаем )
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
20.04.2010, 15:45  [ТС]
я вернулся )))

Вообщем, я понял как записать\считать биты.
вот что сделал
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.04.2010, 15:45
Помогаю со студенческими работами здесь

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

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

фаил типа запись..
мне надо из stringgrid считать информацию в фаил записей.. в программирование новичок... объясните пожалуйста, что не так делаю type ...

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru