2015-11-04 48 views
1

我有一个字符串说:将十六进制字符串转换为两个不同的十进制数字的上下文。用C

char *hexstring = "08fc0021"; 

这两个信息的级联每两个字节长。 该字符串的前两个字节,即:08fc对应于dec中的2300。 。 最后4个字节,即0021 - > 33

我的问题是这个字符串转换成两个不同的变量,说:

int varA, varB; 

这里翻会有数2300和varB = 33.

通常我会用sscanf将字符串转换为十进制数字。 但现在我有两个不同的信息连接字符串的这个问题。

任何想法建议如何钉这个?

THX提前

+2

想想它:如何将字符串分成两个字符串?谷歌如果不可行,就自己去做。 – Downvoter

+1

'sscanf',它会给你32位的数字0x08fc0021。现在你可以把这个数字分成两个数字0x08fc和0x0021。这非常非常基本的操作留给读者。 –

+0

thx you two,for a fast answer。例如,可以做一个简单的“二进制”操作(向左/右移位4位,以此类推),以获得想要的信息。 我后来的是如果有一个功能可以完成这项工作的构建。例如,通过你定义一个起始内存地址......例如,ala sscanf ..在那里你给出了字符串的开始和结束地址 – KapaA

回答

1

位与来救援!

因此,您可以使用从sscanf得到的结果32位数字(int?)上的按位AND操作符完成您所需要的操作。

你第一次从字符串获得数:

char* hexstring = "0x08fc0021"; 
int num = 0; 
sscanf(hexstring, "%x", &num); //put the number into num. 

然后你得到你想要使用&位:

int varA=0, varB=0; 
varA = num & 0xFFFF; //will get the second half. 
varB = num & 0xFFFF0000; 
varB = varB >> 16; // now you have the first half as well. 

有你有它。

1
int main(int argc, char *argv[]) { 

    char *hexstring = "08fc0021"; 
    unsigned long hexnumber = 0u; 
    unsigned short a = 0u; 
    unsigned short b = 0u; 

    /* Use sscanf() to convert the string to integer */ 
    sscanf(hexstring, "%x", &hexnumber); 

    /* Use bitwise and to filter out the two higher bytes * 
    * and shift it 16 bits right       */ 
    a = ((hexnumber & 0xFFFF0000u) >> 16u); 

    /* Use bitwise AND to filter out the two lower bytes */ 
    b = (hexnumber & 0x0000FFFFu); 

    printf("0x%X 0x%X\n",a,b); 

    return 0; 
} 
1

您可以使用此方法(位操作):

char *hexstring = "08fc0021"; 

int aux; 
sscanf(hexstring, "%x", &aux); 
printf("aux = 0x%x = %d\n", aux, aux); 

int varA = (aux & 0xFFFF0000) >> 16, varB = aux & 0x0000FFFF; 
printf("varA = 0x%x = %d\n", varA, varA); 
printf("varB = 0x%x = %d\n", varB, varB); 

结果:

AUX = 0x8fc0021 = 150732833
翻= 0x8fc = 2300
varB = 0×21 = 33

编辑:
或者这种方法(字符串操作):

// requires a hexstring length of 8 or more sophisticated logic 
char *hexstring = "08fc0021"; 
int len = strlen(hexstring); 

char varA[5], varB[5]; 
for(int i = 0; i<len; i++) 
{ 
    if(i < 4) varA[i] = hexstring[i]; 
    else varB[i-4] = hexstring[i]; 
} 

varA[4] = varB[4] = '\0'; 

int varAi, varBi; 
sscanf(varA, "%x", &varAi); 
sscanf(varB, "%x", &varBi); 

printf("varAi = 0x%x = %d\n", varAi, varAi); 
printf("varBi = 0x%x = %d\n", varBi, varBi); 

相同的结果:

varAi = 0x8fc = 2300
varBi = 0×21 = 33

相关问题