powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Преобразование int к бинарному виду
16 сообщений из 16, страница 1 из 1
Преобразование int к бинарному виду
    #38575051
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу подсказать как можно сделать такое преобразование:
Например есть число 1385323200 его нужно преобразовать к бинарному виду и на stdout вывести: "└ZТR", т.е ascii символ соответствующий бинарному представлению. Не верное представление символа, символ "?" имеет код 192.

У меня есть процедура которая делает необходимые вычисления (код ниже), но есть сложность когда делаю преобразование к unsigned char получаются не те символы :АZ’R вместо └ZТR. Т.е. символы до 128 переводятся правильно, а от 129 - 256 нет. Подскажите, что я делаю не так?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
string source::pack(string format, string data){
	string output = "";
	vector<unsigned char> tmp;
	if (format == "I") {
		int value = stoi(data);
		while (value >= 256) {
			int rest = value % 256;
			output.push_back((char) rest);
			value = (value - rest) / 256;
			tmp.push_back((unsigned char) rest);
		}
		output.push_back((char) value);
		tmp.push_back((unsigned char) value);
	} else {
		source::message(__FUNCTION__,"Don`t understand format: " + format);
	}
	return output;	
}
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38575055
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadНе верное представление символа, символ "?" имеет код 192.
не актуально
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38575070
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadПрошу подсказать как можно сделать такое преобразование:
Например есть число 1385323200 его нужно преобразовать к бинарному виду и на stdout вывести: "└ZТR", т.е ascii символ соответствующий бинарному представлению. Не верное представление символа, символ "?" имеет код 192.

Код: plaintext
1.
2.
3.
int num = 1385323200;
char *p = (char *) &num;
printf("%c%c%c%c", p[0], p[1], p[2], p[3]);
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38575106
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijad,

вы явно что-то делаете не так. Опишите задачу которую вы пытаетесь решить.
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38575130
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_,

Для начала попробую по короче, хочу записать целое 4 байта на вывод, прочитать вывод из другого процесса. Например в другом процессе я читаю 4 байта, и обратно преобразую к целому.
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38575136
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TGijadПрошу подсказать как можно сделать такое преобразование:
Например есть число 1385323200 его нужно преобразовать к бинарному виду и на stdout вывести: "└ZТR", т.е ascii символ соответствующий бинарному представлению. Не верное представление символа, символ "?" имеет код 192.

Код: plaintext
1.
2.
3.
int num = 1385323200;
char *p = (char *) &num;
printf("%c%c%c%c", p[0], p[1], p[2], p[3]);



Похоже на правду, спасибо.
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38575164
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadПохоже на правду, спасибо.
обратно по тому же принципу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int res = 0;
char *r = (char *) &res;  // получаем указатель на первый байт переменной
// заполняем побайтно
r[0] = p[0]; 
r[1] = p[1];
r[2] = p[2];
r[3] = p[3];

printf("res = %d", res);



PS И не надо никаких расчетов. Ошибка у тебя была в том что char это знаковый тип, может принимать значения от -128 до 127. unsigned char от 0 до 255.
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38575186
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TPS И не надо никаких расчетов. Ошибка у тебя была в том что char это знаковый тип, может принимать значения от -128 до 127. unsigned char от 0 до 255.
Еще раз спасибо, проверил, то что нужно.
В приведенной выше функции я пробовал и char и unsigned char, но разницы там не много например код 192, char преобразовывал к -64 и в структуре vector <char> сохранял A (смотрел через дебагер), а если использовал vector<unsigned char> то код был 192 а символ тоже A (смотрел через дебагер)
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38575224
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijadsherzod_,
Для начала попробую по короче, хочу записать целое 4 байта на вывод, прочитать вывод из другого процесса. Например в другом процессе я читаю 4 байта, и обратно преобразую к целому. Есть 3 способа.

1. Используйте потоки C++. Он медленнее следующего, но надежнее (не надо думать о типах и внутренней кухне).
Код: plaintext
1.
2.
3.
4.
5.
int i = 12234;
std::cout << i;

int i = 0;
std::cin >> i;


2. Бинарный, нужно быть предельно аккуратным и точным (и не нужно никаких преобразований в строки, это приведет к ошибкам). Следующее будет работать только при передаче данных на одной и той же машине.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include <cstdio>
#include <cstdint>
using namespace std;

// Запись
uint32_t i = 12234;
const void *raw = reinterpret_cast<const void *>(&i);
fwrite(raw, sizeof(uint32_t), 1, stdout);

// Считывание
uint32_t i = 0;
void *raw = reinterpret_cast<void *>(&i);
fread(raw, sizeof(uint32_t), 1, stdin);


3. Почитайте про сериализаторы (serialization) и используйте что-нибудь готовое.
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38576368
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadDima Tпропущено...


Код: plaintext
1.
2.
3.
int num = 1385323200;
char *p = (char *) &num;
printf("%c%c%c%c", p[0], p[1], p[2], p[3]);



Похоже на правду, спасибо.

Похоже на поводу, но неправда ....
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38576379
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_Следующее будет работать только при передаче данных на одной и той же машине.'nj это поправимо преобразованием порядка байтов host<->network : htonl(), ntohl()
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38576556
Efremovs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, очень познавательно. Сам использовал свой говно-код. Спасибо
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38577504
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПохоже на поводу, но неправда ....
Можете объяснить почему? Я проверил такой подход на типе float и коротких целых, и тоже все получилось как надо. Основной критерий успешности чтобы перловая функция unpack корректно распознала передаваемые данные с соответствующими шаблонами.
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38577524
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadMasterZivПохоже на поводу, но неправда ....
Можете объяснить почему? Я проверил такой подход на типе float и коротких целых, и тоже все получилось как надо. Основной критерий успешности чтобы перловая функция unpack корректно распознала передаваемые данные с соответствующими шаблонами.


Про двум причинам.
Первая - ты так и не объяснил толком, что же тебе нужно.
Вторая - архитектуры машин бывают разные, и порядок этих байт может быть любой на данной конкретной машине. Использование сетевого порядка, по который тут говорили уже, было бы правильнее.
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38577615
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПро двум причинам.
Первая - ты так и не объяснил толком, что же тебе нужно.
Вторая - архитектуры машин бывают разные, и порядок этих байт может быть любой на данной конкретной машине. Использование сетевого порядка, по который тут говорили уже, было бы правильнее.
Нужно передавать данные от одного процесса к нескольким, данные нужно передавать в некотором формате. Как вариант, я передаю следующим образом: например int или float я просто пишу в 4 байта (порядок не важен т.к. этот формат мой и только, важен лишь порядок действий), если мне нужно передать строку то это выглядит так: (int длинна строки)(сама строка). Собственно этого мне достаточно чтобы передать любые данные, и представленный Dima T способ мне замечательно подошел.
...
Рейтинг: 0 / 0
Преобразование int к бинарному виду
    #38577706
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GijadMasterZivПро двум причинам.
Первая - ты так и не объяснил толком, что же тебе нужно.
Вторая - архитектуры машин бывают разные, и порядок этих байт может быть любой на данной конкретной машине. Использование сетевого порядка, по который тут говорили уже, было бы правильнее.
Нужно передавать данные от одного процесса к нескольким, данные нужно передавать в некотором формате. Как вариант, я передаю следующим образом: например int или float я просто пишу в 4 байта (порядок не важен т.к. этот формат мой и только, важен лишь порядок действий), если мне нужно передать строку то это выглядит так: (int длинна строки)(сама строка). Собственно этого мне достаточно чтобы передать любые данные, и представленный Dima T способ мне замечательно подошел.

Тогда ладно.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Преобразование int к бинарному виду
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]