0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 21
1

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

05.12.2013, 21:42. Показов 4430. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2013, 21:42
Ответы с готовыми решениями:

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

Работа с двоичным файлом
Условие: Дан файл, представляющий собой телефонную книжку некоторого молодого человека, т.е....

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

Битовые поля и работа с двоичным числом без логических операций
Есть 2 числа. Например, 10110 и 11100 в дв. сист. сч. Нужно разряд первого числа сравнить с тем...

4
29 / 29 / 18
Регистрация: 20.12.2010
Сообщений: 119
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
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 21
06.12.2013, 04:01  [ТС] 3
4AKE, а как в экземпляр класса bitset поместить новое значение типа int?
0
29 / 29 / 18
Регистрация: 20.12.2010
Сообщений: 119
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
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 21
06.12.2013, 16:56  [ТС] 5
Фу, Я чуть умом не тронулся пока это допер, сам
во всяком случае благодарю!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2013, 16:56
Помогаю со студенческими работами здесь

Головоломка с двоичным кодом
Ребята помогите решить (фраза на русском из трех слов): 11010000 10011010 11010001 10000010...

Усилитель, управляемый двоичным кодом
Нубский вопрос по электронике: управляемый двоичным кодом-это значит что нужно поставить ЦАП на...

Преобразование файла в текстовый с двоичным кодом и обратно!
Помогите с программой для преобразования в текстовый файл с двоичным кодам и обратно! если такая...

Замена старшего байта А двоичным кодом числа k
Здравствуйте. Задача в том чтобы произвести замену старшего байта А двоичным кодом числа k. БУду...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru