LINUX.ORG.RU

sprintf uint32_t --> бинарная строка


0

1

Какой самый простой способ в Си скомпоновать строку чтобы 32-битный беззнаковый int там был не числом, а бинарной строкой?

uint32_t в моём случае получается из функции inet_aton:

struct in_addr addr;
inet_aton("10.0.0.1", &addr);

char buf[10];
sprintf(buf, "abcde%s", addr.s_addr); // Так конечно не работает
Итого в buf хочется получить строку, которая при просмотре в hex редакторе будет выглядеть так:
61 62 63 64 65 0A 00 00 01

Ответ на: комментарий от TOXA

Кажется вопрос не понят. %x выводит hex представление. Я не указывал, что мне нужен hex.

Olegymous ★★★
() автор топика
Ответ на: комментарий от Olegymous
uint32_t yourint =0x0a000001;
char buf[10];
size_t bufsz=4;
buf[0]=*((char*)(&yourint));
buf[1]=*((char*)(&yourint)+1);
buf[2]=*((char*)(&yourint)+2);
buf[3]=*((char*)(&yourint)+3);
TOXA ★★
()
Ответ на: комментарий от arsi

Интересная функция, добавил в закладки.

char buf[10];

strcpy(buf, "abcde");
memcpy(buf+5, &(addr.s_addr), sizeof(addr.s_addr));

fwrite(buf, 1, 9, stdout);

Так получилось и похоже работает.
Интересная особенность. Хотел вывести через printf, но он из-за встретившегося нулевого байта на второй позиции выводил только 1 байт.
Еще сначала написал *buf = «abcde», думал прокатит. Нет, пришлось воспользоваться strcpy(). Интересно что я такое написал?

Olegymous ★★★
() автор топика
Ответ на: комментарий от Olegymous

fwrite умеет писать в строку? Насколько вижу только в файл.

вы не поверите - fwrite пишет в поток..а уж с чем этот поток ассоциирован уже не его дело. Это может быть в том числе и область памяти (та-же строка, см. fmemopen) и вообще нечто самодельное (см fopencookie)

MKuznetsov ★★★★★
()
Ответ на: комментарий от rg-400

>endians?

тут уже как компилятор скажет, так и будет. & вернет младший адрес, а что там относительно него: либо 0x0a000001, либо 0x0100000a

поправьте, если я не прав

TOXA ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.