使用十六进制数字

时间:2018-02-20 17:31:33

标签: c casting

我正在使用一个命令行工具,它接受不同的参数并使用它们执行各种操作。

我的第一个参数是NOR memory的基地址,并说它是0x6000000。由于它是argv传递的,因此类型为char *

我将此值作为FILE_SYSTEM_BASE_ADDRESS传递,并在此等式中使用:

start_addr = FILE_SYSTEM_BASE_ADDRESS + (NOR_FS_MIN_BCLK_SIZE * FILE_SYSTEM_SECTOR_NUMBER);

等式中的所有其他值均为uint32_t类型。目前,我使用类型转换将char*转换为uint32_t,显然会为其提供新的uint32_t值。

我的问题是:

  1. 有没有办法可以获得这种格式?

    start_addr = 0x600000 + (NOR_FS_MIN_BCLK_SIZE * FILE_SYSTEM_SECTOR_NUMBER) 
    
  2. 原始等式和当前方法获得的值是否会给出错误的start_addr值?

  3. 目前,如果我使用此声明

    printf(Image File Start Offset: 0x%x\n , start_addr); 
    

    我得到0x67作为结果。

    我是否正确处理了这些论点?

1 个答案:

答案 0 :(得分:2)

这是你的问题:

  

...我使用类型转换将char *转换为uint32_t ....

如果有人像这样运行你的程序:

foo 0x600000

然后arg[1]条目将是具有值"0x600000"的字符串的地址。字符串的地址可以转换为uint32_t,但是要转换字符串的地址而不是字符串表示的值。除了作为访问字符串的方法之外,字符串的地址对您没用。

要将字符串表示的值转换为数字,可以使用像strtoul这样的库函数:

uint32_t FILE_SYSTEM_BASE_ADDRESS = strtoul(arg[1], NULL, 0);

查看文档以了解有关strtoul的更多信息。永远不要只是因为编译器说某些东西是错误的类型。找出将所需内容转换为所需内容的正确方法。 有时候是演员,但往往不是。