我正在使用一个命令行工具,它接受不同的参数并使用它们执行各种操作。
我的第一个参数是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
值。
我的问题是:
有没有办法可以获得这种格式?
start_addr = 0x600000 + (NOR_FS_MIN_BCLK_SIZE * FILE_SYSTEM_SECTOR_NUMBER)
原始等式和当前方法获得的值是否会给出错误的start_addr
值?
目前,如果我使用此声明
printf(Image File Start Offset: 0x%x\n , start_addr);
我得到0x67
作为结果。
我是否正确处理了这些论点?
答案 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
的更多信息。永远不要只是因为编译器说某些东西是错误的类型。找出将所需内容转换为所需内容的正确方法。 有时候是演员,但往往不是。