如何将字符串转换为二进制?

时间:2011-06-05 23:49:11

标签: c binary

我正在开发一个C项目,我有一些类型的说明:

add $1 $2 $3

所以我正在读取这一行作为一个字符串,解析它并有一个相应的整数添加,比如说2.可以有人请告诉我如何将其转换为二进制以便将其写入文件?

寄存器为5位,操作为6位。总数将为32(最后10位未使用)。

因此寄存器存储在op[] = "2"char r1[] = "1"char r2[] = "2"等中(注意寄存器编号可以高达31)。任何人都可以给我一个函数示例,它将以000010 00001 00010 00011 0000000000

格式将其转换为二进制

5 个答案:

答案 0 :(得分:2)

最简单的方法是使用位字段:

struct code {
    unsigned opcode : 6;
    unisgned operand1 : 5;
    unisgned operand2 : 5;
    unisgned operand2 : 5;
} test_code;

现在您可以简单地分配给不同的成员:

test_code.opcode = 0x02;
test_code.operator1 = 0x01;
test_code.operator2 = 0x02;
test_code.operator3 = 0x03;

答案 1 :(得分:0)

atoi(op)会给你2,所以你可以把它串在一起

只要将它放入您想要的结构中,只需创建一个包含位域的结构并将其放在带有32位无符号整数的并集中,您就可以直接获取该值。

答案 2 :(得分:0)

快速伪代码

const char* int32_to_bin(int32_t value) {
  int pos = 0;
  char output[33];
  while(value > 0) {
    if (value & 1) output[pos++] = '1';
    else           output[pos++] = '0';
    value >>= 1;
  }
  output[pos] = 0;
  return output;
}

答案 3 :(得分:0)

你问的是一个C问题,但你标记为objective-c所以我将覆盖它们。

<强> C:

这些变量如op[]..实际上定义为char op[..](不确定你的长度),当然是C字符串。

因此操作为6位,每个寄存器为5位,即15 + 6 = 21位字。我假设前11位是零。

你需要的是另外4个整数变量:

int opint; int r0int; int r1int; int r2int;

您希望这些字符串的整数值进入这些整数。您可以使用atoi()来实现此目的,例如opint = atoi(op);

现在你已经得到了从字符串派生的整数,你需要创建32位字。最简单的方法是首先创建一个整数,将这些位保存在正确的位置。你可以这样做(假设32位整数):


int word = 0;
word |=    ((opint & 0x3f) << (21 - 6))) |
            (r0int & 0x1f) << (21 - 11)) |
            (r1int & 0x1f) << (21 - 16))
            (r2int & 0x1f)); 

&lt;&lt;正在转移到位。在此之后,你应该正确形成整数这个词。接下来,只需将其转换为二进制表示(如果这是必要的?不确定您的应用程序)

<强>目标C

唯一的区别是我假设这些字符串以NSString *op;等开头。在这种情况下,按opint = [op intValue];获取整数,然后按照我的描述形成单词。

答案 4 :(得分:0)

此代码将字符串转换为二进制

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

char* stringToBinary(char* s) ;
void binchar(char output[],  char character);
void itoa(int value, char* str, int base);

int main(int argc, char const *argv[])
{
    printf("%s\n", stringToBinary("asdf") );
}


char* stringToBinary(char* s) {
    if(s == NULL) return 0; /* no input string */
    size_t len = strlen(s);
    char *binary = malloc(len*8 + 1); // each char is one byte (8 bits) and + 1 at the end for null terminator
    int i =0;

    char output[9];
    for(i=0; i< len; i++){
        binchar(output,  s[i]);
        strcat(binary,output);
    }
    return binary;
}


void binchar(char output[],  char character)
{
    //char output[9];
    itoa(character, output, 2);
}



// since GCC is not fully supporting itoa function here is its implementaion
// itoa implementation is copied from here http://www.strudel.org.uk/itoa/

void itoa(int value, char* str, int base) {

    static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";

    char* wstr=str;

    int sign;




    // Validate base

    if (base<2 || base>35){ *wstr='\0'; return; }



    // Take care of sign

    if ((sign=value) < 0) value = -value;




    // Conversion. Number is reversed.

    do *wstr++ = num[value%base]; while(value/=base);

    if(sign<0) *wstr++='-';

    *wstr='\0';



    // Reverse string
void strreverse(char* begin, char* end);
    strreverse(str,wstr-1);

}

void strreverse(char* begin, char* end) {

    char aux;

    while(end>begin)

        aux=*end, *end--=*begin, *begin++=aux;

}