如何在C中将十六进制数读入unsigned int

sil*_*ent 3 c file copying

我想将文本文件中的十六进制数读入无符号整数,以便我可以执行机器指令.它只是一个模拟类型的东西,它查看文本文件内部并根据值及其相应的指令输出寄存器中的新值.

例如,说明将是:

  • 1RXY - >将寄存器R保存为存储器地址XY中的值
  • 2RXY - >将寄存器R保存为XY值
  • BRXY - >跳转到寄存器R,如果xy是这个等等.
  • ARXY - > AND在内存地址XY处注册R值

文本文件在新行中包含类似的内容.(在十六进制中)

  • 120F
  • B007
  • 290B

我的问题是将每个单独的指令复制到无符号整数...我该怎么办?

#include <stdio.h>
int main(){
    FILE *f;
    unsigned int num[80];

    f=fopen("values.txt","r");
    if (f==NULL){
        printf("file doesnt exist?!");
    }

    int i=0;
    while (fscanf(f,"%x",num[i]) != EOF){
        fscanf(f,"%x",num[i]);
        i++;
    }
    fclose(f);
    printf("%x",num[0]);
}
Run Code Online (Sandbox Code Playgroud)

caf*_*caf 5

你走在正确的轨道上.这是我看到的问题:

  • 如果fopen()返回,则需要退出NULL- 您正在打印错误消息,但随后继续.
  • 你的循环应该终止i >= 80,所以你不会读取比你有空间更多的整数.
  • 您需要传递地址而num[i]不是值fscanf.
  • fscanf()在循环中调用了两次,这意味着你丢弃了一半的值而没有存储它们.

以下是修复这些问题的样子:

#include <stdio.h>

int main() {
    FILE *f;
    unsigned int num[80];
    int i=0;
    int rv;
    int num_values;

    f=fopen("values.txt","r");
    if (f==NULL){
        printf("file doesnt exist?!\n");
        return 1;
    }

    while (i < 80) {
        rv = fscanf(f, "%x", &num[i]);

        if (rv != 1)
            break;

        i++;
    }
    fclose(f);
    num_values = i;

    if (i >= 80)
    {
        printf("Warning: Stopped reading input due to input too long.\n");
    }
    else if (rv != EOF)
    {
        printf("Warning: Stopped reading input due to bad value.\n");
    }
    else
    {
        printf("Reached end of input.\n");
    }

    printf("Successfully read %d values:\n", num_values);
    for (i = 0; i < num_values; i++)
    {
        printf("\t%x\n", num[i]);
    }

    return 0
}
Run Code Online (Sandbox Code Playgroud)


KFr*_*Fro 5

您还可以使用函数strtol().如果使用16的基数,它会将十六进制字符串值转换为int/long.

errno = 0;
my_int = strtol(my_str, NULL, 16);
/* check errno */
Run Code Online (Sandbox Code Playgroud)

编辑:另外注意,各种静态分析工具可能会将像atoi()和scanf()这样的东西标记为不安全.atoi已经过时,因为它没有像strtol()那样检查错误.另一方面,scanf()可以执行各种缓冲区溢出,因为它不检查发送到scanf()的类型.例如,你可以给一个指向scanf的短指针,其中读取值实际上是一个很长的....并且繁荣.