转载的http://www.cctry.com/forum.php?mod=viewthread&tid=8387&archiver=1
有几种方法还是蛮好的。
在程序中,我们有时需要将一个十六进制字符串转换为十进制数字。比如:
char *ptr="0x11";
int n=0;
//我们想让n等于0x11,即17
通常我们在C中,想将一个字符串转换为一整形数字,通常会使用下面的方法:[code]char *ptr="123";
int n=0;
n=atoi(ptr);
printf("%d\n",n);
//输出:123[/code]但是atoi库函数只能将十进制字符串转化为int整形,比如下面的例子:[code]#include <stdlib.h>
#include <stdio.h>//atoi头文件
int main(void)
{
int n;
char *str = "12345.67";
n = atoi(str); //int atoi(const char *nptr);
printf("string = %s integer = %d\n", str, n);
return 0;
}
/*输出:
string = 12345.67 integer = 12345
*/[/code]所以要用atoi函数将"0x11"转化为十进制整形17是不行的。如果用的话,会输出下面的结果:[code] int n;
char *str = "0x11";
n = atoi(str); //返回值n等于0 (显然不是我们想要的结果)[/code]那怎么办呢?这时有人会想,那好办,我们自己写个函数转化下就行了,比如用下面的方法:
注意:我们用VC 6.0建了一个Win32控制台程序,为了方便,程序中使用了CString类型变量,需要做一点修改。
(1)包含afx.h头文件
(2)在Project->Settings->General->Mircosoft Foundation Classes中,选择Use MFC in a Shared DLL
然后我们就可以在Win32控制台下使用CString变量了,否则会出现编译错误。[code]#include <iostream>
#include <afx.h>
int ChangeNum(CString str,int length)
{
charrevstr[16]={0};//根据十六进制字符串的长度,这里注意数组不要越界
int num[16]={0};
int count=1;
int result=0;
strcpy(revstr,str);
for (int i=length-1;i>=0;i--)
{
if ((revstr[i]>='0') && (revstr[i]<='9'))
num[i]=revstr[i]-48;//字符0的ASCII值为48
else if ((revstr[i]>='a') && (revstr[i]<='f'))
num[i]=revstr[i]-'a'+10;
else if ((revstr[i]>='A') && (revstr[i]<='F'))
num[i]=revstr[i]-'A'+10;
else
num[i]=0;
result=result+num[i]*count;
count=count*16;//十六进制(如果是八进制就在这里乘以8)
}
return result;
}
int main()
{
CString str="0x11";
int n=0;
n=ChangeNum(str,str.GetLength());
printf("%d\n",n);
return 0;
}
/*输出:
17
*/[/code]是的,上面方法可以得到我们想要的值。还有更简单的方法吗?当然有!
方法1:[code]#include <stdio.h>
int main()
{
char szValue[]= "0x11";
int nValude = 0;
sscanf(szValue,"%x",&nValude);
printf("%d\n",nValude);
return 0;
}
/*输出:
17
*/[/code]主要用到sscanf这个库函数:
函数名: sscanf
功能: 执行从字符串中的格式化输入
用法: int sscanf(char *string, char *format[,argument,...]); //%x就是我们要格式化的类型,即输出十六进制
方法2:[code]#include <stdio.h>
#include <stdlib.h>//strtol头文件
int main()
{
char *p="0x11";
char *str;
int i = (int)strtol(p, &str, 16);//十六进制
printf("%d\n",i);
return 0;
}
/*输出:
17
*/[/code]主要用到strtol这个库函数,它的使用方法是:
函数名: strtol
功能: 将串转换为长整数
用法: long strtol(char *str, char **endptr, int base);//base指明我们要转换为几进制数
程序例:[code]#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *string = "0x11", *endptr;
long lnumber;
/* strtol converts string to long integer */
lnumber = strtol(string, &endptr, 16);
printf("string = %slong = %ld\n", string, lnumber);
return 0;
}
/*输出:
string = 0x11 long = 17
*/[/code]在VC 6.0的MFC程序中,我们有时要转换句柄就可以用strtol这个函数,比如:
HANDLE handle = (HANDLE)strtol(str,NULL, 16);
PS:句柄是什么?
句柄就是用来区分各种内存对象的唯一标识符号,是个32位整数。
有些是整个系统唯一(如窗口句柄),有些是当前进程或线程中唯一(如线程句柄,全局的有另一个标识符)。
详细的可分为许多种,都是以H开头的。在VB中使用时全部都用Long。
常见的有窗口句柄(HWND),设备描述表句柄(HDC),内存句柄(HMEM),文件句柄,进程句柄,线程句柄,笔的类型句柄(HPEN),字体句柄(HFONT),区域句柄(HRGN)等等。
在申请句柄时是要占用资源的,分三类SYSTEM、USER、GDI。而WINDOWS的资源是固定的,并不随内存的扩大而扩大,所以使用完以后一定要释放。
方法3:
在网上,还看到一位朋友提出一种方法,就是读写INI文件(我认为这种方法效率太低,毕竟要读写文件的),也将其摘录如下:[code]//存储HANDLE
struct Tag_STRUCT
{
HWND hWnd;
} ;
struct Tag_STRUCT Struct;
Struct.hWnd = m_hWnd;
//把包含句柄的结构体写入ini文件
WritePrivateProfileStruct("Section","Key",&Struct,sizeof(Struct),"C:\\1.ini");
//读取HANDLE
struct Tag_STRUCT
{
HWND hWnd;
} ;
struct Tag_STRUCT Struct;
//从包含句柄的结构体的ini文件读取HANDLE
GetPrivateProfileStruct("Section","Key",&Struct,sizeof(Struct),"C:\\1.ini");
分享到:
相关推荐
STM32十六进制字符串转十进制数值STM32十六进制字符串转十进制数值STM32十六进制字符串转十进制数值
本VI实现十进制字符串强制转换为16进制字符串,即输入10进制的0CDA可输出16进制的0CDA
labview十六进制转十进制,输入字符串控件是十六进制显示。
实现labview编写上位机以十进制输入数据直接以十六进制发送到下位机的转换程序
二进制数值至八进制,十进制,十六进制字符串转换; 十六进制数值至二进制,八进制,十进制字符串转换; 十进制数值至二进制,八进制,十六进制字符串转换。
用Labview将4字节16进制数转换成10进制数
Arduino串行到整数读取将其转换为长整数的十进制和十六进制字符串。 [简要说明]串行字符串到十进制整数。 该函数仅接受DEC或HEX字符串,否则该函数将返回0。如果用分号分隔,则该函数还接受多个输入。 如果前缀为0x...
包含ASIIC、16进制,数值,字符串互转;二进制,十六进制互转;十进制显示的十六进制格式字符串转Labview所识别的十六进制,通讯下位机必备技能。总共8个VI!
答:“进制转换”只能转换数值型,而“字符转换”是把该字符串一位一位 分别当作字符来转换! 2."字符转换"中想把对应的值转化为对应的字符,如果包括分隔符,需要手工 填入。 (详见上面的:ASCII转字符) 3....
在C#中,将16进制字符串转换成十进制数值
起初是想把12位的十六进制字符串转为十进制,找了一圈发现基本上都是先转换为数值型的中间变量int、long(long long是c++11的,开发环境没到),再转换为十进制字符串。这样会导致一个问题就是溢出,当十六进制表示...
如下所示: var hex="0x29";//十六进制 ...//将int值转换为十六进制 alert("hex:"+hex+"\ncharValue:"+charValue+"\ncharCode:"+charCode+"\nhexOri:"+hexOri); 以上就是小编为大家带来的javascrip
Qt字符转换,串口接收数据转为中文显示可用。Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值
如何实现十进制和十六进制转换Visual Basic6.0源程序,VB6.0源代码
PB关于字符进制数转化及base64加密、解密 1、字符型十六进制数转为十进制数值 2、十进制数转为十六进制字符 3、base64加密 4、base64解密 5、将blob转为byte数组
注意 除 X 以指定的大小写形式显示十六进制字符之外,其他格式字符不区分大小写。 格式字符后的值(一般示例中为 xx)指定显示的值的有效位数或小数位数。 有关格式化字符串的更多信息,请参阅格式设置概述。
一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin() 函数,如下实例 ...所能转换的最大数值为十进制的 4294967295,其结果为 32 个 1 的字符串。 2,十进制转八进制 decoct() 函数 echo decoct(15)
1.可以将字符(包括中文和英文)和Unicode相互转换。2.将正整数转化为八进制、二进制、十进制、十六进制。3.键盘钩子,根据按键,显示字符、ACS码值、二进制数值。编译环境VC++6.0,系统:windows xp SP3
这篇文章主要介绍了使用Python内置的模块与函数进行不同进制的数的转换的方法,Python也使得读取纯二进制文件内容非常方便,需要的朋友可以参考下 ...bin(num) 十进制数值 ===》二进制字符串 bin(10) >>
这两天在开发STM32的Modbus主站,就买了一个RS485总线的温湿度传感器来,温湿度传感器说明要求将传感器返回的Modbus报文数据转换为10进制后再除以10得到真实数据,以下是举例 Modbus主站发送报文: 01 04 00 01 00 ...