【问题标题】:Storing a hexadecimal number in an int将十六进制数存储在 int 中
【发布时间】:2015-01-06 06:47:51
【问题描述】:

尝试使用来自 http://pastebin.com/k7VkA3xQ 的输入实现绝对加载器

当前获得的输出:http://pastebin.com/FiYPMWrZ

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <string.h>


int dec(char hex[]){ //function converts a hex array of characters to its equivalent decimal value

int length,i,sum=0;
for(length=0;hex[length]!='\0';length++);

for (i = 0;hex[i]!='\0'; ++i,--length)
{
    if (hex[i]>='0' && hex[i]<='9') 
        sum+=(hex[i]-'0')*pow(16,length-1);
    else if (hex[i]>='A' && hex[i]<='Z')    
        sum+=hex[i]-'A'+10;
    else if (hex[i]>='a' && hex[i]<='z')    
        sum+=hex[i]-'a'+10;
}
return sum;
}


int main(int argc, char const *argv[])
{
char record[2],progname[10],startaddr[10],proglen[10],addr[10],len[10];
int start,address,diff,flag=1,decimal;
FILE *fptr;

if (access("Input.dat",F_OK)!=-1)
{
    fptr = fopen("Input.dat","r");
    printf("File opened successfully\n");
}
else
{
    printf("File opened unsuccessfully\n");
    exit(1);
}


fscanf(fptr,"%s",record);
if (strcmp(record,"H")==0){
    fscanf(fptr,"%s",progname);fscanf(fptr,"%s",startaddr);fscanf(fptr,"%s",proglen);
}

fscanf(fptr,"%s",record);
while(strcmp(record,"T") == 0 ){
    fscanf(fptr,"%s",addr);fscanf(fptr,"%s",len);
    if (flag)
        sscanf(startaddr,"%x",&start);
    else
        start = address; //'start' fails to store the hex value of 'address'

    sscanf(addr,"%x",&address);
    diff = address - start;
        while((diff--)>0){
            printf("%x              xx\n",start++);
    }
    decimal = dec(len)%3==0?dec(len)/3:dec(len)/3+dec(len)%3;
    while(decimal--){
        fscanf(fptr,"%s",addr);
        printf("%x              ",address++);   printf("%c%c\n",addr[0],addr[1]);   
        printf("%x              ",address++);   printf("%c%c\n",addr[2],addr[3]);   
        printf("%x              ",address++);   printf("%c%c\n",addr[4],addr[5]);   
    }
        fscanf(fptr,"%s",record);
}


return 0;
}

不确定如何让'start'存储'address'的值......目前..'start'从1000H打印......请帮助我将十六进制值'address'存储在int'中start'...上述实现的输入和输出文件已附在上面...谢谢!

【问题讨论】:

  • “十六进制数”不是数字,而是字符串。在所有标准计算机上,“数字”只是二进制。可以将一个数字表示为十进制字符串或十六进制字符串(或“2542”,如果您愿意的话),但对于计算机来说,数字仍然只是二进制位,拼写出来,编码为“2542”或“0x9EE”,都是相同的数值。
  • 您可以考虑将scanf%x 转换,或strtol 处理转换。
  • (您上面的算法只是简单地将数字相加,顺便说一句。要将十六进制表示转换为数字,您需要在每次迭代之前将 sum 乘以 16。)

标签: c loader systems-programming


【解决方案1】:

如果十六进制数以0x...0X...... 的形式存储在字符串hex 中,其中点代表16 base 中的数字,那么您可以使用sscanf() 函数将值存储在 10 base

中的 整数(以下示例中为 decimalNumber
sscanf(hex,"%x",&decimalNumber);

所以举个完整的例子

char hex[100]="0xf";
int decimalNumber;
sscanf(hex,"%x",&decimalNumber);
printf("The value of decimalNumber is %d\n",decimalNumber);

输出将是

The value of decimalNumber is 15

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2010-12-15
    • 2013-07-04
    相关资源
    最近更新 更多