有什么方法可以转换这样的数组
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"
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
。
无需使用函数调用,您可以通过
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
假设你确定每一项包含 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。