Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 757
1

Как получить бинарный код символа?

07.05.2016, 01:06. Показов 5067. Ответов 15
Метки нет (Все метки)

Я читаю txt в котором разные символы(без русских) типа такого 45h8giJDFJH
Я должен прочитать их и перевести их в бинарный код из 100101010101011000
А потом эти 0 и 1 я должен инвертировать примерно так
Мне нужно только получить их символов двоичный код, я не знаю как((

C++
1
cout<<~data<<"\n";
или
C++
1
2
3
char x='a';
for(i=7;i<0;i--)
cout<<((x>>i)?'1':'0');
У меня такой код.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdio.h>
 
using namespace std;
 
int main()
{
    //читаем данные 
    char data;
    ifstream F ("C:\\test.txt", ios::in);
    if (F){
        while (!F.eof()){
            F>>data;
            //printf("%d\n", data); ..тут только ascii читает, но это не то
            cout.width(10);
            cout<<data<<" \n";
        }
    }
    F.close();
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2016, 01:06
Ответы с готовыми решениями:

Как получить код символа unicode в std::wstring?
Собственно есть QString (Qt), из него конечно же могу получить std::wstring. Так вот, нужен код...

Получить код Unicode из символа
Можно как-нибудь получить код символа Unicode? Например: ₽ - U+20BD @ - U+0040

Как получить код символа?
Здравствуйте. Мне необходимо получить код символов строки. Я работаю так: foreach...

Как получить второй код символа
Привет. Работаю с русским текстом и файлами. Сидя в отладчике в QT первый раз увидел что символ...

15
2725 / 1888 / 560
Регистрация: 05.06.2014
Сообщений: 5,504
07.05.2016, 01:26 2
cout<<((x>>i)?'1':'0'); cout<<((x>>i)&1?'1':'0');
0
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 757
07.05.2016, 01:46  [ТС] 3
Renji, Это конечно хорошо, но что бы к этому перейти мне нужно сначала перевести.
Вот я тут пошарился и нашел кое что, пытался переделать, но работает странно
В файле DRhe а на экране выводиться 01100101
Ни чего не понимаю
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(){
    char data;
    int k = 128;
    ifstream F ("C:\\test.txt", ios::in);
    if (!F.eof()){
        while (k>0){
            F>>data;
            printf("%d", bool(data&k)); 
            k=k>>1;
        }
    }
    F.close();
0
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
07.05.2016, 18:00 4
Лучший ответ Сообщение было отмечено ArxangelXA как решение

Решение

немного переделал последний вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(){
    char data;
    ifstream F("C:\\test.txt", ios::in);
    while (!F.eof()) {
        int k = 128;
        F >> data;
        while (k > 0){
            printf("%d", bool(data & k));
            k = k >> 1;
        }
        printf(" ");
    }
    F.close();
}
1
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 757
08.05.2016, 02:26  [ТС] 5
Vort_, Спасибо)) Вот это да всего лишь чуть чуть изменили и все, я удивлен))

Добавлено через 7 часов 48 минут
Vort_, А вот у меня вопрос, я не понял в файле один символ допустим 1. А на экран выводиться два кода 11001110 11001110
Почему? Код написан уже по инверсии, мне надо было бинарный инвертировать, вот поставил ~.
Но почему два кода? и вообще правильно ли он выдает?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include <fstream>
 
using namespace std;
 
int main(){
    //читаем данные
    char data;
    ifstream F("C:\\test.txt", ios::in);
    while (!F.eof()) {
        int k = 128;
        F >> data;
        while (k > 0){
            printf("%d", bool(~data & k));
            k = k >> 1;
        }
        printf(" ");
    }
    F.close();      
system("pause");
return 0;
}
0
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
08.05.2016, 07:35 6
Лучший ответ Сообщение было отмечено ArxangelXA как решение

Решение

ArxangelXA, моя ошибка, прошу прощения.

проверка while (!F.eof()) неверна.
eof возвращает true только после неуспешного чтения.
соответственно, надо или такую проверку ставить в средину цикла или проверять непосредственно результат выполнения операции ввода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <fstream>
 
using namespace std;
 
int main(){
    //читаем данные
    char data;
    ifstream F("C:\\test.txt", ios::in);
    while (F >> data) {
        int k = 128;
        while (k > 0){
            printf("%d", bool(~data & k));
            k = k >> 1;
        }
        printf(" ");
    }
    F.close();
    system("pause");
    return 0;
}
по поводу инверсии - вроде всё правильно
1
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 757
08.05.2016, 13:44  [ТС] 7
Vort_, Спасибо все работает))
0
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 757
10.05.2016, 20:57  [ТС] 8
Vort_,
Тут как оказалось мне немного по другому нужно сделать, допустим 4 = 110010(11) тут последние 2 бита инвертируем а остальные первые 6 не трогаем. потом следующий символ g =10011000 инвертируем полностью. следующий 6 = 11001001 тоже весь инвертируем. дальше начинаем по такой же схеме последние два потом все. Получается читаем 3 символа в первом последние 2 инв. в следующих двух все инв.
А потом все записываем в бинарный файл.
Я точно не знаю как нужно написать, попробовал так но цикл не работает.

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
#include "stdafx.h"
#include <fstream>
 
using namespace std;
const char *filename="finput.txt"
const int *BINFILE="BINFILE.bin"
 
int main(){
    //÷èòàåì äàííûå
    int i;
    char data;
    ifstream F("filename", ios::in);
    if(!fin){cout<<"not file"<<endl;
    return 0;
}
    while (F >> data) {
        int k = 128; 
        while (k > 0){
            bool(data & k));
            k = k >> 1;
        }
        for(i=5; i=17; i++){
            printf("%d", (~k[i]));
        }
        printf(" ");
    }
    F.close();      
 
    //çàïèñûâàåì äàííûå
    ofstream bfile("BINFILE", ios::binery| ios::ate);
    while(BINFILE){
        bfile<<BINFILE<<endl;
    }
    if(bfile.bad())
        {cerr<<"oshibka \n";
    return 0;
    }
    bfile.close();
 
    system("pause");
    return 0;
}
0
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
11.05.2016, 07:33 9
Лучший ответ Сообщение было отмечено ArxangelXA как решение

Решение

Цитата Сообщение от ArxangelXA Посмотреть сообщение
Я точно не знаю как нужно написать, попробовал так но цикл не работает.
этот пример даже не собирается, поэтому не пойму откуда выводы о нерабочести цикла

но я могу пояснить решение на предыдущем примере:
  1. Раз нужно проверять номер символа, то для этого следует ввести переменную-счётчик. Я назвал её index.
  2. Для определения условия "каждый третий" я использовал операцию нахождения остатка от деления на 3. Допустим, есть индексы 0, 1, 2, 3, 4, 5, 6, 7. Если применить к ним эту операцию, получится 0, 1, 2, 0, 1, 2, 0, 1. Дальше можно разделить обработку символов с нулевыми индексами (по модулю 3) и со всеми остальными.
  3. В случае, когда index % 3 == 0, требуется дополнительная проверка - на номер бита. За номер бита в алгоритме отвечает счётчик k. Он принимает значения 128, 64, 32, 16, 8, 4, 2 и 1. Чтобы выловить два младших бита, надо сравнить его значение с числом 2.
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
#include "stdafx.h"
#include <fstream>
 
using namespace std;
 
int main(){
    //читаем данные
    char data;
    int index = 0;
    ifstream F("C:\\test.txt", ios::in);
    while (F >> data) {
        int k = 128;
        while (k > 0){
            bool bit = (data & k) != 0;
            if (index % 3 != 0)
                bit = !bit;
            else
                if (k <= 2)
                    bit = !bit;
            printf("%d", bit);
            k = k >> 1;
        }
        index++;
        printf(" ");
    }
    F.close();
    system("pause");
    return 0;
}
1
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 757
14.05.2016, 17:36  [ТС] 10
Vort_, Этот код хороший и работает все ок. Но мне тут сказали мол как этот код будет запускаться на каком нибудь старом гг... На машинке древней эти циклы будут считаться вечно. По этому сказали сделать побитово. Я нашел что это значит. Должно быть все банально просто. Я не совсем понял как это работает. пытался сделать что то вроде такого вроде. Но я не знаю как переменную А побитово инвертировать. Что бы инвертировались только 2 последних байта(без циклов и счетчиков).

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
#include <fstream>
#include "stdafx.h"
#include <iostream>
 
using namespace std;
int main(){
unsigned char a, b, c;
    ifstream F("C:\\test.txt", ios::in); 
        while(F.eof()){
            F>>a; //первый байт
            F>>b; //второй байт
            F>>c; //третий байт
    
            b = ~b; 
            c = ~c; 
            a = ;
//можно ли написать так??
a0=a0;
a1=a1;
a2=a2;
a3=a3;
a4=a4;
a5=a5;
a6=a6;
a7=~a7;  
a8=~a8;   
        }
     printf("%d", a);
     printf(" ");
     printf("%d", b);
     printf(" ");
     printf("%d", c);
     printf(" ");
 
     F.close( ); 
     system("pause");
     return 0;
}
Добавлено через 5 минут
Я не знаю как передать первый байт в первую переменную, второй байт во вторую переменную и 3 в третью. Потом два инвертировать сразу, а один побайтно расписать Нашел примеры в интернете но там задаются переменные
0
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
14.05.2016, 18:02 11
Лучший ответ Сообщение было отмечено ArxangelXA как решение

Решение

Вариант с тремя переменными не пройдёт если, к примеру, в файле будет 4 символа.

Я понял что требуется. И это не побитовый доступ. Это изменение всех битов переменной сразу. Сейчас напишу ещё вариант.

Добавлено через 18 минут
Вот:
Надеюсь, я нигде не налажал
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
#include "stdafx.h"
#include <fstream>
 
using namespace std;
 
int main()
{
    char c1;
    char c2;
    int index = 0;
    ifstream inf("C:\\test.txt", ios::in);
    ofstream outf("C:\\test.bin", ios::out | ios::binary);
    while (inf >> c1)
    {
        if (index % 3 != 0)
            c2 = ~c1;
        else
            c2 = c1 ^ 3;
        outf << c2;
 
        int k = 128;
        while (k > 0)
        {
            printf("%d", (c2 & k) != 0);
            k = k >> 1;
        }
 
        index++;
        printf(" ");
    }
    inf.close();
    outf.close();
    system("pause");
    return 0;
}
Можно ещё избавиться и от модуля.
Но я не уверен что это стоит делать.

По поводу решения:
Используется операция инверсии (~) и операция исключающего ИЛИ (^).
С инверсией, думаю, понятно, а вот таблица для ^ (XOR):
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
То есть, там где у второго операнда единицы, биты будут инвертированы, а там где нули - останутся как были.
К примеру,
00110011
^
00000011
=
00110000
1
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 757
15.05.2016, 02:55  [ТС] 12
Vort_, Работает конечно все прекрасно. Вы просто мастер)) Честно завидую белой завистью))) Блин как это у вас получается все так писать и кучу разных вариантов. Я один то вариант написать не могу((( как так научится?((
И ваш код не совсем понимаю....((
Теперь у меня вопросы возникли.
1)Эту часть кода я могу удалить, если мне не нужно выводить на экран, так?
C++
1
2
3
4
5
6
int k = 128;
        while (k > 0)
        {
            printf("%d", (c2 & k) != 0);
            k = k >> 1;
        }
или нет.
это нахождение 1 и 2 байта делением?
C++
1
if (index % 3 != 0)
а как раз вот это вывод в бинарном коде, да?
C++
1
(c2 & k)
как получается что переводится в бинарный вид?

2) А почему int k = 128 почему именно 128?
3) Как проверить что bin записалось? я его в разных кодировках в блокноте открывал ни как все иероглифы((
4) А почему с 3мя переменными нельзя? он бы 3 переменные заполнял 3мя байтами потом возвращался на начало программы к следующим 3мя байтам и так по кругу, нет что ли? Такая моя теория не прокатила бы?
Символов там действительно не 3, там где то около 12т.))) 6т. строк по 24 символа в строке.
0
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
15.05.2016, 08:16 13
Лучший ответ Сообщение было отмечено ArxangelXA как решение

Решение

Цитата Сообщение от ArxangelXA Посмотреть сообщение
1)Эту часть кода я могу удалить, если мне не нужно выводить на экран, так?
да, и эту тоже: printf(" ");
Цитата Сообщение от ArxangelXA Посмотреть сообщение
это нахождение 1 и 2 байта делением?
тут используется нахождение остатка от деления, немного другая операция
это сравнение находит байты с индексами 1, 2, 4, 5, 7, 8 и т. д.
соответственно, в else ветку попадут индексы 0, 3, 6, ...
Цитата Сообщение от ArxangelXA Посмотреть сообщение
а как раз вот это вывод в бинарном коде, да?
это проверка определённого бита на равенство единице
Цитата Сообщение от ArxangelXA Посмотреть сообщение
как получается что переводится в бинарный вид?
2) А почему int k = 128 почему именно 128?
в цикле проверяются биты от старшего к младшему
для этого используется операция & - побитовое И
цикл состоит из 8ми итераций - по количеству бит в байте
k принимает значения:
10000000 (128)
01000000 (64)
00100000 (32)
00010000 (16)
00001000 (8)
00000100 (4)
00000010 (2)
00000001 (1)

Значение 128 позволяет проверить 7й бит, 64 - 6й бит (обычно биты считаются от младших к старшим)
К примеру, если взять символ q:
01110001
&
10000000
=
00000000 -> значит старший, 7й, бит равен 0

01110001
&
01000000
=
01000000 -> 6й бит равен 1
и т.д.
Цитата Сообщение от ArxangelXA Посмотреть сообщение
3) Как проверить что bin записалось? я его в разных кодировках в блокноте открывал ни как все иероглифы((
для этого используются Hex-редакторы
но можно глянуть и с помощью Visual Studio
для этого в диалоге открытия файла (Ctrl+O) надо нажать на стрелочку, пририсованную к кнопке "Открыть", выбрать в выпавшем меню "Открыть с помощью" и в открывшемся списке выбрать "Двоичный редактор"
Цитата Сообщение от ArxangelXA Посмотреть сообщение
4) А почему с 3мя переменными нельзя? он бы 3 переменные заполнял 3мя байтами потом возвращался на начало программы к следующим 3мя байтам и так по кругу, нет что ли? Такая моя теория не прокатила бы?
Допустим, в файле четыре символа: 0123.
На первой итерации в a, b, c попадут 0 1 и 2
На второй - в a запишется 3. Но что делать программе дальше, если файл закончился?
1
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 757
15.05.2016, 14:55  [ТС] 14
Vort_, Спасибо)
Цитата Сообщение от Vort_ Посмотреть сообщение
На второй - в a запишется 3. Но что делать программе дальше, если файл закончился?
А просто выйти из программы нельзя? при условий что инфа закончилась?

Цитата Сообщение от Vort_ Посмотреть сообщение
index++;
это увеличение на единицу? А для чего? Что бы пропускать каждый третий байт?
0
198 / 198 / 78
Регистрация: 10.07.2012
Сообщений: 405
15.05.2016, 15:00 15
Лучший ответ Сообщение было отмечено ArxangelXA как решение

Решение

Цитата Сообщение от ArxangelXA Посмотреть сообщение
А просто выйти из программы нельзя? при условий что инфа закончилась?
если добавить соответствующие проверки, то можно
но мне кажется, что такой вариант будет слишком громоздким
Цитата Сообщение от ArxangelXA Посмотреть сообщение
это увеличение на единицу? А для чего? Что бы пропускать каждый третий байт?
это счётчик, увеличивающийся на единицу после каждого считанного байта
по его значению определяется режим обработки байтов - или инверсия всех битов или только двух младших
1
43 / 13 / 1
Регистрация: 20.08.2012
Сообщений: 757
15.05.2016, 15:07  [ТС] 16
Vort_, Большое спасибо!!)) Вы очень мне помогли.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2016, 15:07

Как получить код символа из строки?
Здравствуйте, имеется строка &quot;ABCDEFG&quot; как из нее получить код символов, т.е. А=0041, В=0042 и т.д....

Как получить код символа Unicode в VS
Здравствуйте, вот у меня такая проблема: Мне необходимо получить код символа Unicode в программе....

как получить код символа в ASCII?
как получить код символа в ASCI?

Как можно получить ASCII код символа?
Как можно получить ASCII код символа? Как по ASCII коду узнать символ.


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.