将二进制转换为相应的ASCII字符

时间:2019-10-05 05:30:06

标签: c character-encoding binary ascii decode

因此,我正在尝试创建一个程序,在该程序中,用户输入12位二进制汉明码序列(例如“ 100010010001”),并且应打印出其相应的ASCII字符,在这种情况下为“ A”。

我正在尝试让我的程序忽略位于_ _ 0 _ 1 0 0 _ 0 0 0 1 1中的4个奇偶校验位,并将其他8位移到一起。在else语句中,我尝试将剩余的8位转换为字符。但是,当我尝试运行该程序时,键入二进制序列并按Enter键后,程序将崩溃。这是我正在努力的程序的一部分,我想知道是否有人可以帮助我或向我提示我做错了什么?

char charToBin(char usersInput[]) {
    char c = " ";
    for (int i = 12; i >= 0; i--) {
        if((i == 0) || (i == 1) || (i == 3) || (i == 7)){
            usersInput[i] = usersInput[i + 1];
        }else{
            c = strtol(usersInput[i], (char **)NULL, 2);
        }
    }
    return c;
}

4 个答案:

答案 0 :(得分:0)

if((i == 0) || (i == 1) || (i == 3) || (i == 7)){
            usersInput[i] = usersInput[i + 1];
        }else{

在这里,如果您是if(条件),那之后的大括号是不必要的。

if((i == 0) || (i == 1) || (i == 3) || (i == 7))
            usersInput[i] = usersInput[i + 1];
        else{

也许会解决

答案 1 :(得分:0)

您的程序有两个编译错误:

  1. 您不能将字符串分配给字符(c =“”);
  2. strtol调用使用字符串而不是字符

修复编译错误后,需要对逻辑进行两个修复:  1.从左到右执行输入字符串的过滤,以避免将位置12复制到11,将11复制到10,这将导致复制最后的位置。需要一个额外的计数器来帮助压缩。  2.输入完全压缩后,执行一次strtol。

char charToBin(char usersInput[]) {
    char j = 0 ;
    // Copy relevant input positions, INCLUDING terminating NUL byte at position 12.
    for (int i = 0; i <= 12 ; i++) {
        if((i == 0) || (i == 1) || (i == 3) || (i == 7)){
                continue ;
        } ;
        usersInput[j] = usersInput[i] ;
        j++ ;
    } ;
    char c = strtol(usersInput, (char **)NULL, 2);
    return c;
}

答案 2 :(得分:0)

对于您的代码,不能乱用“ strtol”。您提供给“ strtol”的char数组不能以“ \ 0”结尾。同样,不管您做什么,数组都将始终具有12个索引,除非您将“ \ 0”复制到索引9,以便“ strtol”知道它是输入的结尾。

此外,有时循环不是最好的。对于您的情况,您已经知道要使用多少个索引。使用循环没有意义。尽管如此,我还是编写了两种方法,并在下面提供了测试代码作为示例。

#include <stdio.h>

/*
 * This function generate a hammer binary digit string for testing.
 * It does not care about the validity of the hammer bit.
 * The array that is passed to this function should be the length of 12.
 */

void generateChar(int value, char * output){
    output[0] = '0';
    output[1] = '0';
    output[3] = '0';
    output[7] = '0';
    output[2] =  (value & 0b10000000) > 0? '1' : '0';
    output[4] =  (value & 0b01000000) > 0? '1' : '0';
    output[5] =  (value & 0b00100000) > 0? '1' : '0';
    output[6] =  (value & 0b00010000) > 0? '1' : '0';
    output[8] =  (value & 0b00001000) > 0? '1' : '0';
    output[9] =  (value & 0b00000100) > 0? '1' : '0';
    output[10] = (value & 0b00000010) > 0? '1' : '0';
    output[11] = (value & 0b00000001) > 0? '1' : '0';   
}

/* 
 * First method.
 *
 */
char charToBin(char usersInput[]) {
    char c = 0;
    c = usersInput[2] == '1'?  c | 0b10000000 : c;
    c = usersInput[4] == '1'?  c | 0b01000000 : c;
    c = usersInput[5] == '1'?  c | 0b00100000 : c;
    c = usersInput[6] == '1'?  c | 0b00010000 : c;
    c = usersInput[8] == '1'?  c | 0b00001000 : c;
    c = usersInput[9] == '1'?  c | 0b00000100 : c;
    c = usersInput[10] == '1'? c | 0b00000010 : c;
    c = usersInput[11] == '1'? c | 0b00000001 : c;

    return c;
}

/*
 * Second method.
 */
char charToBin2(char usersInput[]) {
    char temp[9];
    int pos = 0;
    temp[8] = '\0'; // Protect from overflow.

    for ( int i = 2; i < 12; i++ ){
        if ( i == 3 || i == 7 ) continue;
        temp[pos] = usersInput[i];
        pos++;
    }

    return (char) strtol(temp, (char **)NULL, 2);
}

int main(){
    char a[] = "100010010001";
    char t[12];
    int b;

    // Test for method 1
    for ( int i = 0; i < 256; i++ ){
        generateChar(i, t);
        b = charToBin(t);
        printf("%d ", (unsigned char) b );
    }

    printf("\n\n");

    // Test for method 2
    for ( int i = 0; i < 256; i++ ){
        generateChar(i, t);
        b = charToBin2(t);
        printf("%d ", (unsigned char) b );
    }

    return 0;
}

答案 3 :(得分:0)

或者,您可以使用位操作。像这样:

char charToBin(char usersInput[]) {
    unsigned c = strtol(usersInput, NULL, 2);
    unsigned part1 = c & 0xFu;
    unsigned part2 = c >> 1u & 0x70u;
    unsigned part3 = c >> 2u & 0x80u;
    return (char) (part1 | part2 | part3);
}

您愿意输入

char userInput[] = "100010010001";
char ch = charToBin(userInput);
printf("result: %c(%d)\n", ch, ch);

控制台上的以下输出:

result: A(65)