2016-01-18 3 views
0

Я пытаюсь преобразовать строку ascii в двоичную строку в C. Я нашел этот пример Converting Ascii to binary in C, но я скорее не использую рекурсивную функцию. Я попытался написать итеративную функцию в отличие от рекурсивной функции, но в двоичной строке отсутствует ведущая цифра. Я использую itoa для преобразования строки, однако itoa является нестандартной функцией, поэтому я использовал реализацию от What is the proper way of implementing a good "itoa()" function?, предоставленной Minh Nguyen.Как преобразовать строку ascii в двоичную?

#include <stdio.h> 
#include <stdint.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 

int32_t ascii_to_binary(char *input, char **out, uint64_t len) 
{ 
    uint32_t i; 
    uint32_t str_len = len * 8; 

    if(len == 0) 
    { 
     printf("Length argument is zero\n"); 
     return (-1); 
    } 

    (*out) = malloc(str_len + 1); 
    if((*out) == NULL) 
    { 
     printf("Can't allocate binary string: %s\n", strerror(errno)); 
     return (-1); 
    } 

    if(memset((*out), 0, (str_len)) == NULL) 
    { 
     printf("Can't initialize memory to zero: %s\n", strerror(errno)); 
     return (-1); 
    } 

    for(i = 0; i < len; i++) 
     itoa((int32_t)input[i], &(*out)[(i * 8)], 2); 

    (*out)[str_len] = '\0'; 

    return (str_len); 
} 

int main(void) 
{ 
    int32_t rtrn = 0; 
    char *buffer = NULL; 

    rtrn = ascii_to_binary("a", &buffer, 1); 
    if(rtrn < 0) 
    { 
     printf("Can't convert string\n"); 
     return (-1); 
    } 

    printf("str: %s\n", buffer); 

    return (0); 
} 

я 1100001 для символов ASCII a, но я должен получить 01100001, так как преобразовать строку ASCII в целом двоичной строки?

+1

Просто комментарий: вам не нужно, чтобы проверить результат 'memset'. –

+0

'itoa' не передает ведущие нули. Например, с базой 10 вы никогда не получите '097'. – usr2564301

+0

@ Ян Эбботт, спасибо, что вам интересно. – 2trill2spill

ответ

2

Вы можете изменить цикл for на что-то вроде этого:

for(i = 0; i < len; i++) { 
    unsigned char ch = input[i]; 
    char *o = *out + 8 * i; 
    int b; 

    for (b = 7; b >= 0; b--) 
     *o++ = (ch & (1 << b)) ? '1' : '0'; 
} 

или аналогичные:

for(i = 0; i < len; i++) { 
    unsigned char ch = input[i]; 
    char *o = &(*out)[8 * i]; 
    unsigned char b; 

    for (b = 0x80; b; b >>= 1) 
     *o++ = ch & b ? '1' : '0'; 
} 
+0

ни один из этих сбоев с дезинфицирующим устройством Адрес, это было одно из ваших исправлений, которое рушилось. Благодарю вас обоих из этих примеров. – 2trill2spill

0

Эта программа получает и целое число (которое содержит 32 бита) и преобразует его в двоичный формат работы на нем, чтобы получить его работы для ASCii строк:

#include <stdio.h> 

int main() 
{ 
    int n, c, k; 

    printf("Enter an integer in decimal number system\n"); 
    scanf("%d", &n); 

    printf("%d in binary number system is:\n", n); 

    for (c = 31; c >= 0; c--) 
    { 
    k = n >> c; 

    if (k & 1) 
     printf("1"); 
    else 
     printf("0"); 
    } 

    printf("\n"); 

    return 0; 
} 
-1

Лучшее просто написать простую функцию, чтобы сделать это с помощью побитового операторы ...

#define ON_BIT = 0x01 

char *strToBin(char c) { 
    static char strOutput[10]; 
    int  bit; 

    /*Shifting bits to the right, but don't want the output to be in reverse 
    * so indexing bytes with this... 
    */ 
    int  byte; 

    /* Add a nul at byte 9 to terminate. */ 
    strOutput[8] = '\0'; 

    for (bit = 0, byte = 7; bit < 8; bit++, byte--) { 
     /* Shifting the bits in c to the right, each time and'ing it with 
     * 0x01 (00000001). 
     */ 
     if ((c >> bit) & BIT_ON) 
      /* We know this is a 1. */ 
      strOutput[byte] = '1'; 
     else 
      strOutput[byte] = '0'; 
    } 

    return strOutput; 
} 

Что-то вроде этого должно работать, есть много способов, которыми вы можете это сделать. Надеюсь это поможет.

+0

Почему вы возвращаете 'char strOutput [10];' из функции, которая возвращает только символ? – 2trill2spill

+0

Хех, хорошая точка - это должно вернуть символ * - я стою исправлен, приветствую. – Nunchy

+0

Теперь отредактированная функция выглядит нормально, хотя она не является реентерабельной, а старые результаты перезаписываются каждый раз, когда она вызывается, если вызывающий абонент не копирует их в другом месте. –

Смежные вопросы