#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;
}