将十六进制数据转换成有符号十进制数

电玩女神 2022-06-15 06:54 322阅读 0赞

方法一:

#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

  1. #include
  2. int htoi(char s[]);
  3. int main()
  4. {
  5. int a = htoi(“1234”);
  6. int b = htoi(“0x1f”);
  7. int c = htoi(“0XAD”);
  8. printf(“十进制:%d, 十六进制:%#x\n”,a,a);
  9. printf(“十进制:%d, 十六进制:%#x\n”,b,b);
  10. printf(“十进制:%d, 十六进制:%#x\n”,c,c);
  11. return 0;
  12. }
  13. int htoi(char s[])
  14. {
  15. int n,i ;
  16. n = 0;
  17. for (i=0;s[i]!=’\0’;i++)
  18. {
  19. if (s[i]==’0’&&(s[i+1]==’x’||s[i+1]==’X’))
  20. {
  21. i = i+2;
  22. }
  23. if((s[i]>=’0’&&s[i]<=’9’))
  24. {
  25. n = n*16+s[i]-‘0’;
  26. }
  27. else if (s[i]>=’a’&&s[i]<=’f’)
  28. {
  29. n = n*16+10+s[i]-‘a’;
  30. }
  31. else if (s[i]>=’A’&&s[i]<=’F’)
  32. {
  33. n = n*16+10+s[i]-‘A’;
  34. }
  35. }
  36. return n;
  37. }

来源: < 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),然后提取除了最高位之外的所有位,最后在变量前面加上负号(-)。

![Image 1][]

Center

总结: 按位转换有符号十进制数最简单的算法是反转所有位,然后加1。上面的代码实现跟这个最简单的算法在转换原理上是一致的。

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,322人围观)

还没有评论,来说两句吧...

相关阅读