Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2011, 13:11   #1
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию двоичная шестнадцатеричная системы

есть две строки символов, причем в одной строке символы хранятся в бинарном коде, во второй в шестнадцатеричном. например вот такая строка:
ksdhriosdhgiohsdioghsidfhgilsh12345 67890
в обычной кодировке выглядит так:
01101011 01110011 01100100 01101000 01110010 01101001 01101111 01110011 01100100 01101000 01100111 01101001 01101111 01101000 01110011 01100100 01101001 01101111 01100111 01101000 01110011 01101001 01100100 01100110 01101000 01100111 01101001 01101100 01110011 01101000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001 00110000
и так
0x6b 0x73 0x64 0x68 0x72 0x69 0x6f 0x73 0x64 0x68 0x67 0x69 0x6f 0x68 0x73 0x64 0x69 0x6f 0x67 0x68 0x73 0x69 0x64 0x66 0x68 0x67 0x69 0x6c 0x73 0x68 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x30
первое бинарное второе 16ричное.
как, имея две таких строки переделать их в обычный текст?
хранятся они например в CString или просто string или в basic_stringstream

из basic_stringstream все делается просто >>
но заранее неизвестно сколько в потоке символов. как узнать?

Последний раз редактировалось Kukurudza; 05.09.2011 в 13:20.
Kukurudza вне форума Ответить с цитированием
Старый 05.09.2011, 15:17   #2
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию

Код:
#include <iostream>
#include <ctype.h>
#include <string.h>

bool GetWord(char* string, char* word, int& wordOffset);
	union
	{
		unsigned char simb;
		struct
		{
			unsigned int b0 :1;
			unsigned int b1 :1;
			unsigned int b2 :1;
			unsigned int b3 :1;
			unsigned int b4 :1;
			unsigned int b5 :1;
			unsigned int b6 :1;
			unsigned int b7 :1;
		} kod;
	} bykva;

int _tmain(int argc, _TCHAR* argv[])
{
	char word2[8 + 1]; // 8 "бит" + символ завершения строки
	int wordOffset = 0;
	char *stroka = "01101011 01110011 01100100 01101000 01110010 01101001 01101111 01110011 01100100 01101000 01100111 01101001 01101111 01101000 01110011 01100100 01101001 01101111 01100111 01101000 01110011 01101001 01100100 01100110 01101000 01100111 01101001 01101100 01110011 01101000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001 00110000";	

	std::cout << "2 ->:" << std::endl;
	char c;
	while(GetWord(stroka, word2, wordOffset))
	{
		c = word2[0]; bykva.kod.b7 = atoi(&c);
		c = word2[1]; bykva.kod.b6 = atoi(&c);
		c = word2[2]; bykva.kod.b5 = atoi(&c);
		c = word2[3]; bykva.kod.b4 = atoi(&c);
		c = word2[4]; bykva.kod.b3 = atoi(&c);
		c = word2[5]; bykva.kod.b2 = atoi(&c);
		c = word2[6]; bykva.kod.b1 = atoi(&c);
		c = word2[7]; bykva.kod.b0 = atoi(&c);
		std::cout << word2 << " - " << bykva.simb << std::endl;
	}	

	stroka = "0x6b 0x73 0x64 0x68 0x72 0x69 0x6f 0x73 0x64 0x68 0x67 0x69 0x6f 0x68 0x73 0x64 0x69 0x6f 0x67 0x68 0x73 0x69 0x64 0x66 0x68 0x67 0x69 0x6c 0x73 0x68 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x30";
	std::cout << "16 ->:" << std::endl;
	char word16[4 + 1];
	wordOffset = 0;
	while(GetWord(stroka, (char *)word16, wordOffset))
	{
		char * k = word16;
		std::cout << word16 << " - " << (char)strtoul(k, NULL, 0) << std::endl;
	}
	return 0;
}

bool GetWord(char* string, char* word, int& wordOffset)
{
	if (!string[wordOffset])
		return false;
	char *p1, *p2;
	p1 = p2 = string + wordOffset;
	for(int i = 0; i < (int)strlen(p1) && !isalnum(p1[0]); i++)
		p1++;
	if (!isalnum(p1[0]))
		return false;
	p2 = p1;
	while(isalnum(p2[0]))
		p2++;
	int len = int(p2 - p1);
	strncpy(word, p1, len);
	word[len] = '\0';
	for(int i = int(p2-string); i < (int)strlen(string) && !isalnum(p2[0]); i++)
		p2++;
	wordOffset = int(p2 - string);
	return true;
}

Последний раз редактировалось VadEr; 06.09.2011 в 08:53.
VadEr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двоичная арифметика nikozavr C# (си шарп) 16 18.05.2011 14:05
Двоичная система enji4ka Помощь студентам 10 11.05.2011 02:38
Какому типу соответствует шестнадцатеричная константа 0xF7u atenon Общие вопросы C/C++ 7 06.01.2011 19:34
Двоичная арифметика Molotok Помощь студентам 0 26.12.2010 11:27
Двоичная арифметика lilised Помощь студентам 0 02.12.2010 19:09