Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ERET1K
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 21
#1

работа с двоичным кодом - C++

05.12.2013, 21:42. Просмотров 650. Ответов 4
Метки нет (Все метки)

Задача не сложная но материала на ту тему Я на просторах интернета так и не нашел(
Через небольшую программку (самопальный HEX ридер) Я читаю побайтно файл и заношу в массив. Программа работает классно вот код
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
#include <vector>
using namespace std;
 
 
int main()
{
    string $pathto;
    ifstream fin;
    vector< short int > masshex;
    
    cout << "enter path to file" << endl;
    
    getline(cin, $pathto);
    
    fin.open($pathto, ios_base::in | ios_base::binary);
    if(fin.is_open())
        cout << "\nPath is true, file is open\n";
    else{
        cout << "\nERROR opening file\n";
        return 1;
    }
    
    while(!fin.eof()){
        masshex.push_back(fin.get());
    }
    
    fin.close();
    
    cout << "size read " << masshex.size() << " bytes" << "\n";
    
    cout.unsetf(ios::dec);
    cout.setf(ios::hex);
    
    for(int i = 0; i < masshex.size(); ++i){
        if(masshex[i] <= 0x0F) cout << 0;
        cout << masshex[i] << " ";
    }
    
    cout  << endl;
    return 0;
}


теперь мне надо разобрать считанные байты таким образом:

в двоичной системе счисления получить младшие 3 разряда, и старшие пять. К примеру:
первый байт файла в двоичной системе счисления выглядит так 01100011 , мне нужно в отдельную переменную записать 011(три младшие разряда) = 3 и 01100 = 12.
потом Я уже сам буду обрабатывать эти данные.

Вообще Я пытаюсь считать управляющую программу контроллера старого станка с ЧПУ. Который спустя 20 лет сломалася. Но менять станок ещё лет 20 некто не будет, так что ответы вроде забей мне ненужны.

Попробую по конкретнее сформулировать вопрос:
Каким образом можно преобразовать значение типа int в двоичный код шириной в 8 розрядов с возможностью чтения конкретного разряда или нескольких выбранных последовательно расположенных разрядов(как в примере выше только младшие 3 или старшие 5) для дальнейшей обработки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2013, 21:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос работа с двоичным кодом (C++):

Работа с двоичным файлом - C++
Ребят помогите. Создать двоичный файл и записать в него степени числа 3. Вывести на экран компоненты файла с четным порядковым номером....

Работа с двоичным файлом: Перевести содержание файла в поток байт - C++
Существует файл D:\proba.txt в себе он содержит: 68 11 00 00 00 00 71 00 00 00 09 01 C8 01 00 00 01... Он довольно таки длинный до 253...

Работа с пролог кодом из среды С++ - C++
Добрый вечер. Мне дали задание в университете реализовать работу с Prolog кодом из среды С++. И есть инструкция как с помощью...

Сортировка двоичным включением - C++
У меня задание продемонстрировать в виде таблицы алгоритм роботы сортировки с двоичным включением на массиве 15,4,10,8,6,9,16,1.Написал...

Нужно разобраться с двоичным представлением файла - C++
написал такую программу которая сначала определяет размер файла, после создает массив такого же размера, после этого по задумке я должен...

Маленькая программка - вопрос по двоичным числам. - C++
Наткнулся на это. Подскажите как добавить в функционал программки еще и двоичные числа.. PS. хз, но точно не &quot;bin&quot; :) #include...

4
4AKE
29 / 29 / 12
Регистрация: 20.12.2010
Сообщений: 116
06.12.2013, 00:23 #2
Можно использовать побитовые операции над целыми числами для выделения разрядов, а можно использовать класс std::bitset, который поддерживает работу с логическими операциями и преобразование в строку/число. например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <bitset>
using namespace std;
 
int main() {
 
    int n = 98; // 01100010
    
    bitset<8> b8(n);
    cout << b8 <<endl;
    b8[0] = true; // 01100011
    cout << b8 <<endl;
    
    string bit_string = b8.to_string(); // 01100011
    cout << bit_string <<endl; 
    
    bitset<3> b3(bit_string,5,3); // младшие 3 разряда
    bitset<5> b5(bit_string,0,5); // старшие 5
    cout << b3 << " : " << b3.to_ulong() <<endl; // 011 : 3
    cout << b5 << " : " << b5.to_ulong() <<endl; // 01100 : 12
 
    return 0;
}
1
ERET1K
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 21
06.12.2013, 04:01  [ТС] #3
4AKE, а как в экземпляр класса bitset поместить новое значение типа int?
0
4AKE
29 / 29 / 12
Регистрация: 20.12.2010
Сообщений: 116
06.12.2013, 16:53 #4
Цитата Сообщение от ERET1K Посмотреть сообщение
4AKE, а как в экземпляр класса bitset поместить новое значение типа int?
C++
1
2
3
4
bitset<8> bs(0);
cout << bs <<endl; // 00000000
bs = 99;
cout << bs <<endl; // 01100011
Напрямую нельзя присвоить число, на самом деле вызовется оператор присваивания:
C++
1
bs.operator= ( bitset<8>(99) );
Вместо bitset можно использовать std::vector<bool> или boost::dynamic_bitset или структуру типа:
C++
1
2
3
4
5
6
7
8
9
10
struct Byte {
    bool bit1:1;
    bool bit2:1;
    bool bit3:1;
    bool bit4:1;
    bool bit5:1;
    bool bit6:1;
    bool bit7:1;
    bool bit8:1;
};
0
ERET1K
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 21
06.12.2013, 16:56  [ТС] #5
Фу, Я чуть умом не тронулся пока это допер, сам
во всяком случае благодарю!
0
06.12.2013, 16:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2013, 16:56
Привет! Вот еще темы с ответами:

Задача с двоичным поиском в упорядоченном массиве - C++
Может, кто с кодом помочь и комментариями. Дан упорядоченный по неубыванию целочисленный массив и набор чисел ki. Требуется для...

Поиск элемента массива прямым и двоичным способом - C++
Написать программу поиска элемента массива 2 способами: прямым и двоичным поиском. Массив нужно задать с помощью srand. Перед поиском...

Определить, является ли введённая с клавиатуры строка двоичным числом - C++
Задание: Напишите программу, которая определяет, является ли введённая с клавиатуры строка двоичным числом. Люди помогите пожалуйсто...

Проверить, является ли введенная с клавиатуры строка двоичным числом - C++
Написать программу, которая проверяет, является ли введенная с клавиатуры строка двоичным числом. #include &lt;iostream&gt; int main() { ...


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

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

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