web-dev-qa-db-ja.com

CでのCharからBinaryへの変換

文字をバイナリ表現に変換しようとしています(文字->アスキーhex->バイナリ)。

私はシフトする必要があることを知っており、AND。しかし、私のコードは何らかの理由で機能していません。

これが私が持っているものです。 *tempは、C文字列のインデックスを指します。

char c;
int j;
for (j = i-1; j >= ptrPos; j--) {
    char x = *temp;
    c = (x >> i) & 1;
    printf("%d\n", c);
    temp--;
}
7
darksky

SINGLE文字をバイナリに出力する2つの関数を示します。

void printbinchar(char character)
{
    char output[9];
    itoa(character, output, 2);
    printf("%s\n", output);
}

printbinchar(10)はコンソールに書き込みます

    1010

itoaは、単一の整数値を指定されたベースの文字列に変換するライブラリ関数です。たとえば... itoa(1341、output、10)は、出力文字列 "1341"に書き込みます。そしてもちろんitoa(9、output、2)は出力文字列 "1001"に書き込みます。

次の関数は、標準出力に文字の完全なバイナリ表現を出力します。つまり、上位ビットがゼロの場合も、8ビットすべてを出力します。

void printbincharpad(char c)
{
    for (int i = 7; i >= 0; --i)
    {
        putchar( (c & (1 << i)) ? '1' : '0' );
    }
    putchar('\n');
}

printbincharpad(10)はコンソールに書き込みます

    00001010

次に、文字列全体(最後のnull文字なし)を出力する関数を示します。

void printstringasbinary(char* s)
{
    // A small 9 characters buffer we use to perform the conversion
    char output[9];

    // Until the first character pointed by s is not a null character
    // that indicates end of string...
    while (*s)
    {
        // Convert the first character of the string to binary using itoa.
        // Characters in c are just 8 bit integers, at least, in noawdays computers.
        itoa(*s, output, 2);

        // print out our string and let's write a new line.
        puts(output);

        // we advance our string by one character,
        // If our original string was "ABC" now we are pointing at "BC".
        ++s;
    }
}

ただし、itoaはパディングゼロを追加しないため、printstringasbinary( "AB1")は次のように出力されます。

1000001
1000010
110001
29

あなたのコードは非常に曖昧で理解できませんが、代替手段を提供できます。

まず、tempで文字列全体を調べたい場合は、次のようにします。

_char *temp;
for (temp = your_string; *temp; ++temp)
    /* do something with *temp */
_

for条件としての_*temp_という用語は、単に文字列の終わりに達したかどうかを確認するだけです。ある場合、_*temp_は_'\0'_(NUL)になり、forは終了します。

次に、for内で、_*temp_を構成するビットを検索します。ビットを出力するとしましょう:

_for (as above)
{
    int bit_index;
    for (bit_index = 7; bit_index >= 0; --bit_index)
    {
        int bit = *temp >> bit_index & 1;
        printf("%d", bit);
    }
    printf("\n");
}
_

それを少し一般的にする、つまり任意の型をビットに変換するには、_bit_index = 7_をbit_index = sizeof(*temp)*8-1に変更します。

2
Shahbaz
unsigned char c;

for( int i = 7; i >= 0; i-- ) {
    printf( "%d", ( c >> i ) & 1 ? 1 : 0 );
}

printf("\n");

説明:

すべての反復で、1と比較して、ビットとバイナリをシフトすることにより、バイトから最上位ビットが読み取られます。

たとえば、入力値が128であると仮定します。バイナリは1000 0000に変換されます。これを7だけシフトすると0000 0001となるため、最上位ビットは1であったと結論付けます。00000001&1 =1。これが最初のビットです。コンソールに印刷します。次の反復は0 ... 0になります。

1
Simlandir