如何将ascii string转换为二进制?

时间:2016-01-18 18:08:51

标签: c binary ascii

我正在尝试将ascii字符串转换为C中的二进制字符串。我发现这个示例Converting Ascii to binary in C但我宁愿不使用递归函数。我尝试编写迭代函数而不是递归函数,但二进制字符串缺少前导数字。我正在使用itoa转换字符串,但itoa是非标准函数,因此我使用了What is the proper way of implementing a good "itoa()" function?中的实现,即Minh Nguyen提供的实现。

#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字符串转换为整个二进制字符串?

3 个答案:

答案 0 :(得分: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';
}

答案 1 :(得分: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;
}

答案 2 :(得分:-1)

最好只使用按位运算符编写一个简单的函数来执行此操作...

select <...>    
  from A, B, C
       ( (select ID from ...) UNION
         (select ID from ...)
        ) as exist_clause,
where
  A.FK_1 = B.PK and
  A.FK_2 = C.PK and
  A.ID = exist_clause.ID

这样的事情应该有效,你有很多方法可以做到。希望这会有所帮助。