Как преобразовать строку в двоичный файл? - PullRequest
0 голосов
/ 06 июня 2011

Я работаю над проектом 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 ]

2 голосов
/ 06 июня 2011

Самым простым способом будет использование битового поля:

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;
0 голосов
/ 29 декабря 2016

Этот код преобразует строку в двоичный файл

#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;

}
0 голосов
/ 06 июня 2011

То, что вы спрашиваете, является вопросом C, но вы помечаете его как цель-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-битные целые числа) следующим образом:

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

Где << смещается на место.После этого вы должны правильно сформировать слово integer.Затем просто включите его в двоичное представление (если это вообще необходимо? Не уверен в вашем приложении) </p>

Objective-C

Единственное отличие состоит в том, что я предполагаюэти строки начинаются с NSString *op; и т. д. В этом случае получите целые числа по opint = [op intValue];, затем сформируйте слово, как я описываю.

0 голосов
/ 06 июня 2011

Быстрый псевдокод

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;
}
0 голосов
/ 06 июня 2011

atoi (op) даст вам 2, так что вы можете просто связать их вместе

Если вы поместите его в нужную вам структуру, просто создайте структуру с битовыми полями и поместите ее вобъединяет 32-разрядное целое число без знака, и вы можете получить значение напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...