如何将整数数组(0 和 1)转换为 char?

问题描述 投票:0回答:3

有什么方法可以转换这样的数组

int bit_array[8] = {0,0,0,0,0,0,0,0};

变成一个字符? (假设 bit_array 为 ascii 或类似格式)

例如,最终结果最好是这样的:

int bit_array[8] = {0,1,1,0,1,0,0,0}; // h
int bit_array2[8] = {0,1,1,0,1,0,0,1}; // i
char byte;
char byte2;
byte = funny_function(bit_array);
byte2 = funny_function(bit_array2);
printf("%s%s",byte,byte2); //out: "hi"
c byte bit
3个回答
1
投票

printf("%s%s",byte,byte2); //out: "hi"
不会打印任何内容并且是错误的。
%s
需要一个指向 char 的指针,引用以空字符结尾的 C 字符串,并且您传递整数(
char
是一个整数)。

必须是:

printf("%c%c",byte,byte2);

int funny_function(const int *bit_array)
{
    int result = 0;
    for(int i = 0; i < 8; i++)
    {   
        result <<= 1;
        result += !!bit_array[i];
    }
    return result;
}

非零

bit_array
元素值被视为
1


0
投票

无需使用函数调用,您可以通过

main()
主体中的循环来完成此操作。

int main( void ) {
    // Only need 7 'bits'.
    // Let compiler measure size.
    // Use 1 byte 'char' instead of multibyte 'int'
    char bits[][7] = {
        {1,1,0,1,0,0,0}, // h
        {1,1,0,0,1,0,1}, // e
        {1,1,0,1,1,0,0}, // l
        {1,1,0,1,1,0,0}, // l
        {1,1,0,1,1,1,1}, // o
    };

    // for each character row of array
    // Simply use a loop, not a function
    for( int i = 0; i < sizeof bits/sizeof bits[0]; i++ ) {
        char c = 0;

        // for each bit of each character
        // 7 bit values are 'accumulated' into 'c'...
        for( int ii = 0; ii < sizeof bits[0]/sizeof bits[0][0]; ii++ )
            c = (char)( (c << 1) | bits[i][ii] ); // Magic happens here

        putchar( c );
    }
    putchar( '\n' );

    return 0;
}

(友好)输出:

hello

如上所述,如果输出仅限于单个大小写字母(更少的位),则有一个替代版本。

int main( void ) {
    // Only need 5 'bits'.
    char low_bits[][5] = {
        {0,1,0,0,0}, // h
        {0,0,1,0,1}, // e
        {0,1,1,0,0}, // l
        {0,1,1,0,0}, // l
        {0,1,1,1,1}, // o
    };

    for( int i = 0; i < sizeof low_bits/sizeof low_bits[0]; i++ ) {
        char *cp = low_bits[i]; // for clarity (brevity)

        // Magic happens here...
        char c = (char)(cp[0]<<4 | cp[1]<<3 | cp[2]<<2 | cp[3]<<1 | cp[4] );

        putchar( c | 0x40); // uppercase. use 0x60 for all lowercase.
    }
    putchar( '\n' );

    return 0;
}

(不太友好)输出(除非呼叫远处的人):

HELLO

0
投票

假设你确定每一项包含 1 或 0,那么就这么简单:

char funny_function (const int array[8])
{
  char result = 0;
  for(size_t i=0; i<8; i++)
  {
    result |= array[i] << (7-i);
  }
  return result;
}

即:

  • 0,1,1,0,1,0,0,0
    的第一个数组项,左移 7 位 = 0x00,或 0x00 == 0x00。
  • 0,1,1,0,1,0,0,0
    的第二个数组项,左移 6 位 = 0x40,或 0x00 == 0x40。
  • 0,1,1,0,1,0,0,0
    的第 3 个数组项,左移 5 位 = 0x20,或 0x40 == 0x60。
  • 等等。
© www.soinside.com 2019 - 2024. All rights reserved.