将十六进制数据转换成有符号十进制数
来源:互联网 发布:多边形区域填充算法 编辑:程序博客网 时间:2024/06/03 23:46
方法一:
#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位补码表示7011170111601106011050101501014010040100300113001120010200101000110001+0000000000-01000-11111-11001-21110-21010-31101-31011-41100-41100-51011-51101-61010-61110-71001-71111-81000
方法二:网上参考代码
/*练习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。上面的代码实现跟这个最简单的算法在转换原理上是一致的。
阅读全文
0 0
- 将十六进制数据转换成有符号十进制数
- 将十六进制数转换成十进制数
- 将十六进制数转换成十进制数
- 将有符号十进制数转换成二进制
- 将十六进制数据转换成十进制数据
- 有符号十六进制转换为十进制
- 将十进制数转换为十六进制数
- 将十进制数转换为十六进制数
- 将十进制数转换为十六进制数
- 十进制数转换成十六进制
- 编写程序,将一个十进制正整数转换成十六进制数
- 将十进制数转换为十六进制
- 十六进制转换成十进制,将一个十六进制的数转换成一个整数
- 十进制数转换成十六进制数
- 十进制数转换成十六进制数
- 将十进制数转换为二进制数和十六进制数
- 十进制有符号数转十六进制,十六进制高低位再转为十进制
- 如何将十六进制数转换为十进制数
- 正确使用 Volatile 变量
- java小算法—求1+2+3+4+5...+n
- 报错Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)'
- java基础面试题
- 【R语言爬虫】R语言提交get请求抓取城城理财数据
- 将十六进制数据转换成有符号十进制数
- mybatis show sql
- Python环境配置和java共存
- Java 编程题目 第九题
- 用tomcat处理n个请求来说明,什么是进程,什么是线程
- splay bzoj 1588 营业额统计(HNOI 2002)
- 序列化帮助类
- Tensorflow中pad函数解析
- Java网络IO编程总结(BIO、NIO、AIO均含完整实例代码)