幾種將十六進制數據轉換成有符號十進制數


方法一:
#define _READ_HEXADECIMAL_DATA_
#define HEXADECIMAL_ROW_NUM 32

void main()
{
char tempBuffer1[10];
char tempBuffer2[10];
char tempBuffer3[10];

#ifdef _READ_HEXADECIMAL_DATA_
for (k=0,m=0; k<HEXADECIMAL_ROW_NUM; k++,m++)
{
//原始數據低位在前,高位在后。讀取到tempBuffer1數組中,則tempBuffer1[3] 、tempBuffer1[2] 、tempBuffer1[1] 、tempBuffer1[0] 保存的是十六進制數值從高位到低位的排列
tempBuffer1[0] = tempBuffer[1+m*18];
tempBuffer1[1] = tempBuffer[0+m*18];
tempBuffer1[2] = tempBuffer[4+m*18];
tempBuffer1[3] = tempBuffer[3+m*18];
tempBuffer1[4] = '\0'; // C語言規定以字符'\0'作為字符串結束的標志

tempBuffer2[0] = tempBuffer[7+m*18];
tempBuffer2[1] = tempBuffer[6+m*18];
tempBuffer2[2] = tempBuffer[10+m*18];
tempBuffer2[3] = tempBuffer[9+m*18];
tempBuffer2[4] = '\0';

tempBuffer3[0] = tempBuffer[13+m*18];
tempBuffer3[1] = tempBuffer[12+m*18];
tempBuffer3[2] = tempBuffer[16+m*18];
tempBuffer3[3] = tempBuffer[15+m*18];
tempBuffer3[4] = '\0';

AccTemp[0] = TranslateData(tempBuffer1); //函數調用
AccTemp[1] = TranslateData(tempBuffer2);
AccTemp[2] = TranslateData(tempBuffer3);

fprintf(fout, "%d,%d,%d\n", AccTemp[0], AccTemp[1], AccTemp[2]);

}
#endif
}

int16 TranslateData(const char *buff)
{
int i;
int32 iDATA = 0;
uint8 TempNum;
int32 temp = 0;

for(i=0; i<4; i++)
{
if (buff[i]>57)
{
TempNum = (buff[i] - 55); // 相當於TempNum = (buff[i] - 'a' + 10); 'a'的ASCII值是65
}
else
{
TempNum = (buff[i] - 48); // 相當於TempNum = (buff[i] - '0' ); '0'的ASCII值是48
}

temp = (int32)(pow(16.0, i));
iDATA += TempNum * (temp); //按照按位計數制,計算數值
}

if(iDATA > 0x7fff)
{
iDATA = iDATA - 65536; //正整數溢出時,對數值進行反轉
}

return iDATA;
}

表1 符號-數值與2的補碼表示

4位符號數值表示 4位補碼表示
7 0111 7 0111
6 0110 6 0110
5 0101 5 0101
4 0100 4 0100
3 0011 3 0011
2 0010 2 0010
1 0001 1 0001
+0 0000 0 0000
-0 1000 -1 1111
-1 1001 -2 1110
-2 1010 -3 1101
-3 1011 -4 1100
-4 1100 -5 1011
-5 1101 -6 1010
-6 1110 -7 1001
-7 1111 -8 1000
---------------------

方法二:網上參考代碼
/*練習2-3 編寫函數htoi(s),將十六進制數字組成的字符串(包含可選的前綴0x或0X)轉換為與之等價的整型值。
字符串允許包含的數字包括:0~9、a~f、A~F。*/
[html] view plaincopy
#include <stdio.h>  
  
int htoi(char s[]);  
  
int main()  
{  
    int a = htoi("1234");  
    int b = htoi("0x1f");  
    int c = htoi("0XAD");  
    printf("十進制:%d, 十六進制:%#x\n",a,a);  
    printf("十進制:%d, 十六進制:%#x\n",b,b);  
    printf("十進制:%d, 十六進制:%#x\n",c,c);  
    return 0;  
}  
  
int htoi(char s[])  
{  
    int n,i ;  
    n = 0;  
    for (i=0;s[i]!='\0';i++)  
    {  
          
        if (s[i]=='0'&&(s[i+1]=='x'||s[i+1]=='X'))  
        {  
            i = i+2;  
        }  
        if((s[i]>='0'&&s[i]<='9'))  
        {  
            n = n*16+s[i]-'0';  
        }  
        else if (s[i]>='a'&&s[i]<='f')  
        {  
            n = n*16+10+s[i]-'a';  
        }  
        else if (s[i]>='A'&&s[i]<='F')  
        {  
            n = n*16+10+s[i]-'A';  
        }  
    }  
  
    return n;  
}  
來源: <http://blog.csdn.net/cerci0304/article/details/7601877>
 

 

int htoi(const char *s)
{
if( !s )return 0;

if( *s == '0' )
{
s++;
if( *s == 'x' || *s == 'X' )s++;
}

int n = 0;
while( *s )
{
n <<= 4;
if( *s <= '9' )
n |= ( *s & 0xf );
else
n |= ( (*s & 0xf) + 9 );
s++;
}
return n;
}

int main(int argc, char* argv[])
{
printf("%x\n", htoi("0xa"));
printf("%x\n", htoi("0xab"));
printf("%x\n", htoi("0xabc"));
printf("%x\n", htoi("0x0a0b"));
printf("%x\n", htoi("a"));
printf("%x\n", htoi("ab"));
printf("%x\n", htoi("abc"));
printf("%x\n", htoi("12ab"));

return 0;
}

來源: <http://zhidao.baidu.com/link?url=QumjDj-rCtl7odryJw_ZuKEEKK6shOv5v2cZZwl3LvU7bUslar_xinVr6ld2QwNy8gUGebJ2zP8t2U29Wri7Ya>
 


方法三:直接處理一個數的補碼,計算得到有符號十進制數
(1)拼接字符。把兩個無符號的字符,拼接成一個有符號的十進制數,方法是:將高位的字符左移8位,然后位或低8位的字符。
(2)判斷符號。單獨提取最高位的位。方法:要提取的變量位與0x8000
(3)將補碼表示的負數,轉成有符號的十進制數。方法:要轉換的變量先減1,再反轉所有位(反轉所有位的意思是每一個0變為1,每一個1變為0),然后提取除了最高位之外的所有位,最后在變量前面加上負號(-)。

總結:按位轉換有符號十進制數最簡單的算法是反轉所有位,然后加1。上面的代碼實現跟這個最簡單的算法在轉換原理上是一致的。

裝載:https://blog.csdn.net/wind11ddaa/article/details/72772265


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM