如何从输入文件中分离/解码二进制字符串?(C)

如何从输入文件中分离/解码二进制字符串?(C),c,visual-studio,parsing,input,binary,C,Visual Studio,Parsing,Input,Binary,我的程序设法逐行读取输入文本文件,现在我正试图处理一个特定的部分。输入如下所示: ^Other stuff^ CODE 10001100001000100000000000000000 00000000010000110010000000100000 10101100001001000000000000000000 (End of file after CODE section) 二进制数是一个MIPS指令,可以有任意数量的行(我以3为例)。我需要将每个32位的行分成6个部分:操作码、rs、r

我的程序设法逐行读取输入文本文件,现在我正试图处理一个特定的部分。输入如下所示:

^Other stuff^
CODE
10001100001000100000000000000000
00000000010000110010000000100000
10101100001001000000000000000000
(End of file after CODE section)
二进制数是一个MIPS指令,可以有任意数量的行(我以3为例)。我需要将每个32位的行分成6个部分:操作码、rs、rt、rd、shamt、funct(分别为6、5、5、5、6位)

我已经做了:我的程序已经可以读取输入文本并为每个部分调用适当的函数。以下是上下文的一个小片段:

char line[64];

int mode = 0; //for parsing sections, 1 = REGISTER, 2 = MEMORY, 3 = CODE

while (fgets(line, sizeof line, filePtr) != NULL) {
    if (strcmp(line, "REGISTERS\n") == 0) {
        mode = 1;
    }

    else if (strcmp(line, "MEMORY\n") == 0) {
        mode = 2;
    }

    else if (strcmp(line, "CODE\n") == 0) {
        mode = 3;
    }

    switch (mode) {
    case 1:
        parseRegisters(line, registers); //this part works
        break;
    case 2:
        parseMemory(line, memory);  //this part works
        break;
    case 3:
        parseCode(line);  //have not started writing this function
        break;
    default:
        break;
    }
因此,在本节中,它开始为每个二进制行调用parseCode()。如何编写parseCode()将每一行分成6个部分?然后,我需要根据片段解码的内容执行不同的操作,但我已经介绍过了。

可以使用
strtoul
将一串零(
0
)和一(
1
)转换为32位数字:

char *end;
uint32_t value = strtoul(line, &end, 2);
您可以使用
end
确保正确使用了整个
行。第三个参数指定用于转换的基

一旦你有了这个值,你可以很容易地用常规的位屏蔽逻辑屏蔽掉数字的相关部分。这些位实际驻留的位置取决于平台,但假设小端:

#define OPCODE_MASK (0x3FUL <<  0)
#define RS_MASK     (0x1FUL <<  6)
#define RT_MASK     (0x1FUL << 11)
#define RD_MASK     (0x1FUL << 16)
#define SHAMT_MASK  (0x1FUL << 21)
#define FUNCT_MASK  (0x3FUL << 26)

#define GET_OPCODE(X) (((X) & OPCODE_MASK) >>  0)
#define GET_RS(X)     (((X) & RS_MASK)     >>  6)
#define GET_RT(X)     (((X) & RT_MASK)     >> 11)
#define GET_RD(X)     (((X) & RD_MASK)     >> 16)
#define GET_SHAMT(X)  (((X) & SHAMT_MASK)  >> 21)
#define GET_FUNCT(X)  (((X) & FUNCT_MASK)  >> 26)

查阅如何使用指针。您可以使用指向char的指针指向“line”的内容,并逐个查看每个字符。您可以使用指针将部分取出,并将其放入另一个字符串中进行进一步操作。旁白:在示例中,没有任何点将
传递到
parseCode(行)“code”
。函数本身需要调用
fgets
。首先编写函数
int getNumber(char*str,int length)
,该函数将指针指向至少包含
length
二进制数字的字符串,并返回二进制字符串表示的
int
值。
union decode {
    uint32_t code;
    struct {
        uint32_t opcode : 6;
        uint32_t rs     : 5;
        uint32_t rt     : 5;
        uint32_t rd     : 5;
        uint32_t shamt  : 5;
        uint32_t funct  : 6;
    };
};