如何从输入文件中分离/解码二进制字符串?(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;
};
};