C语言中将字节转换为二进制

9

我正在尝试将从fget接收的字节简单转换为二进制。

我知道第一个字节的值是49,根据打印出来的值。现在我需要将其转换为二进制值。

unsigned char byte = 49;// Read from file
unsigned char mask = 1; // Bit mask
unsigned char bits[8];

  // Extract the bits
for (int i = 0; i < 8; i++) {
    // Mask each bit in the byte and store it
    bits[i] = byte & (mask << i);
}
 // For debug purposes, lets print the received data
for (int i = 0; i < 8; i++) {
printf("Bit: %d\n",bits[i]);
}

这将打印出以下内容:
Bit: 1
Bit: 0
Bit: 0
Bit: 0
Bit: 16
Bit: 32
Bit: 0
Bit: 0
Press any key to continue . . .

显然,这不是一个二进制值。需要帮助吗?
6个回答

16
你遇到的问题是你的赋值没有得到一个真或假的值。
bits[i] = byte & (mask << i);

获取位的值。您需要查看位是打开还是关闭,如下所示:

bits[i] = (byte & (mask << i)) != 0;

7

更改

bits[i] = byte & (mask << i);

to

bits[i] = (byte >> i) & mask;

或者

bits[i] = (byte >> i) & 1;

或者

bits[i] = byte & 1;
byte >>= 1;

4

有一种方法,是众多方法之一:

#include <stdio.h>
#include <limits.h>

int main(void) {
    int i;
    char bits[CHAR_BIT + 1];
    unsigned char value = 47;

    for (i = CHAR_BIT - 1; i >= 0; i -= 1) {
        bits[i] = '0' + (value & 0x01);
        value >>= 1;
    }

    bits[CHAR_BIT] = 0;

    puts(bits);

    return 0;
}

1
您可能会注意到输出中有一些1和0,但也有2的幂,例如32。这是因为在使用掩码隔离所需位之后,仍然需要将其位移为最低有效数字,以便它显示为1。或者您可以使用其他帖子建议的方法,而不是位移结果(例如00001000),您可以简单地使用(result!= 0)来获取1或0,因为在C中,false为0,并且诸如!= 的比较将返回1作为true(我想)。

0
#include<Stdio.h>
#include <limits.h>
void main(void) {
    unsigned char byte = 49;// Read from file
    unsigned char mask = 1; // Bit mask
    unsigned char bits[8];
    int i, j = CHAR_BIT-1;
          // Extract the bits
    for ( i = 0; i < 8; i++,j--,mask = 1) {
    // Mask each bit in the byte and store it
    bits[i] =( byte & (mask<<=j))  != NULL;
    }
    // For debug purposes, lets print the received data
    for (int i = 0; i < 8; i++) {
       printf("%d", bits[i]);
   }
   puts("");
}

-1

使用这个替代那个将会起作用:

bits[i]= byte & (mask << i); 
bits[i] >>=i;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接