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

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

Восстановить пароль Регистрация
 
ERET1K
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 14
05.12.2013, 21:42     работа с двоичным кодом #1
Задача не сложная но материала на ту тему Я на просторах интернета так и не нашел(
Через небольшую программку (самопальный 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) для дальнейшей обработки?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
4AKE
29 / 29 / 12
Регистрация: 20.12.2010
Сообщений: 115
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;
}
ERET1K
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 14
06.12.2013, 04:01  [ТС]     работа с двоичным кодом #3
4AKE, а как в экземпляр класса bitset поместить новое значение типа int?
4AKE
29 / 29 / 12
Регистрация: 20.12.2010
Сообщений: 115
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;
};
ERET1K
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 14
06.12.2013, 16:56  [ТС]     работа с двоичным кодом #5
Фу, Я чуть умом не тронулся пока это допер, сам
во всяком случае благодарю!
Yandex
Объявления
06.12.2013, 16:56     работа с двоичным кодом
Ответ Создать тему
Опции темы

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