将Ascii转换为二进制

将Ascii转换为二进制,c,count,binary,ascii,C,Count,Binary,Ascii,我正在写一个程序,我需要将Ascii字符转换成二进制,然后进行计数。我已经让我的代码工作,但它打印的是额外的信息,不一定是正确的二进制文件。下面是我的代码以及给定字符集的输出。任何帮助都将不胜感激 #include <stdio.h> #include <stdlib.h> void binaryPrinter(int digEnd, int value, int * noOfOnes); void print(char c); int cha

我正在写一个程序,我需要将Ascii字符转换成二进制,然后进行计数。我已经让我的代码工作,但它打印的是额外的信息,不一定是正确的二进制文件。下面是我的代码以及给定字符集的输出。任何帮助都将不胜感激

#include <stdio.h>
#include <stdlib.h>

    void binaryPrinter(int digEnd, int value, int * noOfOnes);
    void print(char c);

    int charToInt(char c)
    {
        return (int) c;
    }

    int main()
    {
        char value;
        int result = 1;
        while(result != EOF)
    {
        result = scanf("%c", &value);
        if(result != EOF)
        {
            print(value);
        }
    }
 }

    void binaryPrinter(int digEnd, int value, int * noOfOnes)
    {
        if(value & 1)
        {
        (*noOfOnes) = (*noOfOnes) + 1;
        value = value >> 1;
        digEnd--;
        printf("1");
        }
    else
        {
        value = value >> 1;
        digEnd--;
        printf("0");
        }

    if(digEnd == 0)
        return;
    else
        binaryPrinter(digEnd, value, noOfOnes);
    }

    void print(char c)
        {
        int count = 0;
        printf("The character %c =", c);
        binaryPrinter(8, charToInt(c), &count);
        printf(" 1's = %d\n", count);
        }
#包括
#包括
void二进制打印机(int-digEnd、int-value、int*noOfOnes);
空白打印(字符c);
int charToInt(字符c)
{
返回(int)c;
}
int main()
{
字符值;
int结果=1;
while(结果!=EOF)
{
结果=扫描频率(“%c”和值);
如果(结果!=EOF)
{
印刷品(价值);
}
}
}
void二进制打印机(int-digEnd、int-value、int*noOfOnes)
{
if(值&1)
{
(*noOfOnes)=(*noOfOnes)+1;
值=值>>1;
迪根--;
printf(“1”);
}
其他的
{
值=值>>1;
迪根--;
printf(“0”);
}
如果(digEnd==0)
返回;
其他的
二进制打印机(digEnd、value、noOfOnes);
}
作废打印(字符c)
{
整数计数=0;
printf(“字符%c=”,c);
二进制打印机(8,图表点(c)和计数);
printf(“1的=%d\n”,计数);
}

以下是一对函数:

void printCharAsBinary(char c) {
    int i;
    for(i = 0; i < 8; i++){
        printf("%d", (c >> i) & 0x1);
    }
}

void printStringAsBinary(char* s){
    for(; *s; s++){
        printCharAsBinary(*s);
        printf(" ");
    }
    printf("\n");
}
void打印字符(字符c){
int i;
对于(i=0;i<8;i++){
printf(“%d”,(c>>i)和0x1);
}
}
无效printStringAsBinary(字符*s){
对于(;*s;s++){
打印字符(*s);
printf(“”);
}
printf(“\n”);
}

您可以在此处看到它们的作用:。它们的工作原理是屏蔽每个字符的一个位,然后一次打印一个

输出:(还要注意最后一行-我相信它正在打印空值,但不确定如何删除它)j2l3ks字符j=10101001 1的=4字符2=10110011的=5字符l=11001001的=4字符3=00110011的=4字符k=00101001的=3字符s=00110001的=3字符10101111的=6您提到的ASCII码。您的stdin不太可能只提供ASCII字符,或者您的程序只使用ASCII字符。许多字符集是ASCII的超集。对于ASCII字符,许多编码与ASCII相同。程序以二进制形式打印编码字符的字节值。它不关心也不知道字符集或编码。它们可能是Unicode/UTF-8或类似于Windows-1252的东西。将此字符复制并粘贴到终端中,以查看程序的输出。解释如何输入
j2l3ks
。可能这很简单,因为您正在输入
j2l3ks\n
j2l3ks\0
。此外,您的二进制文件首先打印最低有效位。我使用了ƛ字符并收到了此输出-字符=01000111 1的=4字符=01001101的=4字符=011010001 1的=4字符=01010000 1的=2这里当然是个谜-最后打印的代码在您的两个示例中有所不同。建议
printf(“字符%x%x“%c”=”,(无符号字符)c,(无符号字符)chartPoint(c),c)并报告结果。我怀疑
二进制打印机(8,ChartPoint(c),&count)
中有恶意,特别是
ChartPoint(char c)
。编码准确吗?