我正在尝试将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字符串转换为整个二进制字符串?
答案 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
这样的事情应该有效,你有很多方法可以做到。希望这会有所帮助。