Задать вопрос
oleja1ee7
@oleja1ee7

Как разделить двоичную строку чисел из файла и перевести в Hex?

Здравствуйте, есть файл, в нем содержится N количество строк . В каждой строке не более 250 символов. нули и единицы, без пробелов.
Необходимо извлечь эту строку, после чего, с её конца по 4 символа перевести в 16ричную систему.
Пример:
100 4
00001  01
011101001010110110000001000 3A56C08

Как я понимаю я через ifstream создаю поток, получаю значение в переменную типа char размером 250, а далее удобнее его отправить в функцию, где полученное значение необходимо разделить на 4-х значные, а далее после отделения первой четверки, её посылать в функцию с переводом в 16-тиричную? Как можно отделить по 4 символа с конца?

------------
UPD
Поделил строку, получаю теперь переменную buff2;
в которой теперь например содержится 0100.
Как то можно извлечь её именно в двоичном виде?
Необходимо из такой строки, в окторой двоичное значение. получить 16ричное.
использование
int buff4int = stoi(buff2);
cout << hex << buff4int << endl;

не помогает, потому что он переводит из десятичного.
в ответе 100 это не 4, а 64.
  • Вопрос задан
  • 201 просмотр
Подписаться 1 Простой 1 комментарий
Решения вопроса 3
mindtester
@mindtester
http://iczin.su/hexagram_48
плюсы не мой конек.... не хотите для расширения эрудиции, на другом языке (со мной это значит c#) - да, это не будет прямым решением... но по меньшей мере будет "пищей для ума" ;))

ps если интересно покувыркаться в самой сути - вэлкам в каменты
Ответ написан
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Строку в число с указанием системы счисления
https://ru.cppreference.com/w/cpp/string/basic_str...
Число в hex
https://stackoverflow.com/questions/5100718/intege...
Ответ написан
Комментировать
oleja1ee7
@oleja1ee7 Автор вопроса
Решил все так:
код программы
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

ofstream fout("output.txt");								// открываем поток записи
ifstream fin("input.txt");									// поток чтения из файла

void divide(string buff)
{
	const int size16mes = 4;								// константа равная размеру отделенного сообщения
	int buffl = buff.length();								// размер сообщения
	string buff4 = "";										// буфер для 4символьного сообщения
	string svar = "";										// переменная строка для одного символа
	string itog = "";
	if (buffl % 4 == 0) {
		for (int j = buffl; j > 0; j = j - 4) {				// от размера сообщения, пока размер больше нуля с каждым подходом уменьшаем на 4
			for (int i = 1; i <= size16mes; i++) {			// от 1 до 4х увеличиваем
				svar = buff[buff.size() - 1];				// переписываем последний символ
				buff.erase(buff.rbegin().base() - 1);		// удаляем
				buff4.insert(0, svar);						// помещаем этот символ в новую строку на первое место
			}
			int dec = 0, num, v = 1;
			for (num = buff4.length() - 1; num >= 0; num--){// перевод в 10
				if (buff4[num] == '1')
					dec += v;
				v *= 2;
			}
			int buff10 = dec;								// результат в 10
			stringstream stream;
			stream << hex << buff10;
			string result(stream.str());					// в 16
			itog.insert(0, result);							
			buff4 = "";										// чистим переменную
		}
		fout << itog << endl;								// записываем в файл
	}
	else {
		int lacks = size16mes - (buffl % 4);				// не хватает
		for (int i = 0; i < lacks; i++) {
			buff.insert(0, "0");							// заполняем нулями
		}

		for (int j = buffl; j > 0; j = j - 4) {				// от размера сообщения, пока размер больше нуля с каждым подходом уменьшаем на 4
			for (int i = 1; i <= size16mes; i++) {			// от 1 до 4х увеличиваем
				svar = buff[buff.size() - 1];				// переписываем последний символ
				buff.erase(buff.rbegin().base() - 1);		// удаляем
				buff4.insert(0, svar);						// помещаем этот символ в новую строку на первое место
			}
			int dec = 0, num, v = 1;
			for (num = buff4.length() - 1; num >= 0; num--) {// перевод в 10
				if (buff4[num] == '1')
					dec += v;
				v *= 2;
			}
			int buff10 = dec;								// результат в 10
			stringstream stream;
			stream << hex << buff10;
			string result(stream.str());					// в 16
			itog.insert(0, result);
			buff4 = "";										// чистим переменную
		}
		fout << itog << endl;								// записываем в файл
	}
}

int main()
{
	setlocale(LC_ALL, "rus");								// корректное отображение Кириллицы
	string buff;											// буфер промежуточного хранения считываемого из файла текста
	int nummess;											// переменная в которой хранится количество двоичных сообщений
	fin >> nummess;											// считать число количество строк
	for (int i = 0; i < nummess; i++) {
		fin >> buff;										// считали строку из файла
		divide(buff);										// поместили строку в функцию для деления по 4 символа
	}							
	fout.close();											// закрываем поток записи в файл.
	fin.close();											// закрываем поток чтения из файла
    return 0;
}

Спасибо всем за помощь
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы