как преобразовать char в двоичный файл?

есть ли простой способ преобразовать символ в его двоичное представление?

Я пытаюсь отправить сообщение другому процессу, по одному биту за раз. Итак, если сообщение «Привет», мне нужно сначала преобразовать «H» в двоичный файл, а затем отправить биты по порядку.

Хранение в массиве было бы предпочтительнее.

Спасибо за любой отзыв, псевдокод или фактический код будут наиболее полезными.

Я думаю, я должен упомянуть, что это школьное задание, чтобы узнать о сигналах... это просто интересный способ узнать о них. SIGUSR1 используется как 0, SIGUSR2 используется как 1, и цель состоит в том, чтобы отправить сообщение от одного процесса к другому, делая вид, что среда блокирует другие методы связи.


person Blackbinary    schedule 03.02.2011    source источник
comment
Не могли бы вы привести пример того, что вы ожидаете на самом деле отправить?   -  person Anon.    schedule 04.02.2011
comment
Итак, вы хотите отправлять только одну двоичную цифру за раз? Почему?   -  person Ed S.    schedule 04.02.2011
comment
ну, на самом деле, с сигналами... все, что мне нужно, это двоичное представление символа. поэтому, возможно, я предоставляю массив int, и через какую-то функцию он становится двоичным. затем я могу перебирать массив и отправлять каждый бит. Это своего рода упражнение в нестандартном мышлении.   -  person Blackbinary    schedule 04.02.2011
comment
Будет ли эта коробка помечена как здравомыслие? ж/к, ж/к :)   -  person Ed S.    schedule 04.02.2011
comment
@ Дэвид Хеффернан, я думаю, что это подлый комментарий. Я понимаю, что это определенно не обычный способ делать что-то, но я думаю, вы могли бы просто сказать, что есть гораздо более простой способ делать что-то, или спросить «почему», как это сделал Эд С.   -  person Blackbinary    schedule 04.02.2011
comment
@Blackbinary Возможно, так. Но вам действительно нужно освоить основы. У вас есть учебники? Там вы научитесь быстрее, чем задавать вопросы на SO.   -  person David Heffernan    schedule 04.02.2011
comment
@ Дэвид Хеффернан, я не согласен. SO отлично подходит для вопросов, где у меня есть общее представление, и мне просто нужна помощь с кусочками. В этом случае наш профессор упомянул об использовании битового сдвига, но я не был уверен, что это лучший метод, и я не был на 100% уверен в его реализации. И я стараюсь не покупать учебники, где могу.   -  person Blackbinary    schedule 04.02.2011
comment
Не могли бы вы, ребята, дать ему идею получше, вместо того, чтобы высмеивать его? Мы все когда-то были немного зелеными (и я, вероятно, до сих пор).   -  person Skurmedel    schedule 04.02.2011
comment
вы узнали бы больше, если бы вы прочитали несколько книг и постарались, прежде чем спрашивать здесь   -  person David Heffernan    schedule 04.02.2011


Ответы (2)


Вам нужно только зациклить каждый бит, сделать сдвиг и выполнить логику AND, чтобы получить бит.

for (int i = 0; i < 8; ++i) {
    send((mychar >> i) & 1);
}

Например:

unsigned char mychar = 0xA5; // 10100101

(mychar >> 0)    10100101
& 1            & 00000001
=============    00000001 (bit 1)

(mychar >> 1)    01010010
& 1            & 00000001
=============    00000000 (bit 0)

и так далее...

person Murilo Vasconcelos    schedule 03.02.2011
comment
Вы должны сделать это unsigned char или убедиться, что значение всегда будет положительным, так как результат >> имеет определяемое реализацией значение для отрицательных операндов. - person R.. GitHub STOP HELPING ICE; 04.02.2011

Что о:

int output[CHAR_BIT];
char c;
int i;
for (i = 0; i < CHAR_BIT; ++i) {
  output[i] = (c >> i) & 1;
}

Это записывает биты из c в output, начиная с младшего значащего бита.

person Jeremiah Willcock    schedule 03.02.2011
comment
это именно то, что я хочу, я проверю это. - person Blackbinary; 04.02.2011