做怎样能让鼻翼缩小小能看电脑吗

博客访问: 2537514
博文数量: 102
博客积分: 671
博客等级: 上尉
技术积分: 22761
注册时间:
www.kernel.org
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
& &&今天看到一段将十六进制数的字符转十进制的代码,写得太精妙了。我就又占了前辈们的光,在其基础上扩充了一下,写了个将十六进制字符串转十进制数的接口,和大家分享分享。
/******************************hex2digit.c*****************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HEXTD(x) (((x)<='9')?((x)-'0'):(((x)&7)+9)) &//这就是那段精妙的核心代码
/*&hex_to_digit:将一个由字符串表示的十六进制字串转换成其对应的十进制数。
&* 输入: src 十六进制的字串。
&* 输出: sum 用于接收转换后的结果。
&* 返回值: -1 表示输入的数据有错误;-2 表示输入字串中有非法的字符; 0 表示转换成功。
int hex_to_digit(unsigned int *sum,char* src){
&&&&if(!src || !sum || strlen(src) == 0)
& & & & return -1;
&&&&*sum ^=*sum;
&&&&while(src && *src!='\0'){
&&&&&&&&if(!((*src>='0')&&(*src<='9'))&&!((*src>='a')&&(*src<='f'))&&!((*src>='A')&&(*src<='F')))
& & & & & & & & return -2;
&&&&&&&&*sum = ((*sum << 4) | HEXTD(*src));
& & & & src++;
& &&return 0;
int main(int argc,char** argv){
& & unsigned int a;
&&&&int ret = hex_to_digit(&a,argv[1]);
&&&&if(ret==-1)
& & & & printf("input error!\n");
&&&&else if(ret==-2)
& & & & printf("illegal&letter in string!\n");
& & & & printf("Result is : %lu\n",a);
& & return 0;
& &&编译运行,其结果如下:
& &上述接口还存在有待优化和完善的地方,例如是否可以支持形如"0x804Ed..."这样的十六进制串.在32为系统上,可以表示的最大无符号整形是232-1=
,如果想表示更大的数可以用unsigned long long 型等等.
& &这个程序没有做过充分的测试,不足之处恳请各位予以指正,谢谢。
阅读(5289) | 评论(2) | 转发(7) |
相关热门文章
给主人留下些什么吧!~~
:我记得有本书是专门讲这种技巧的。大神John&Carmack当年也有很神奇的magic&number的故事。不过,我觉得如果这些工作应该交给编写底层库的人去做,如果我们每个人都要考虑这么多,就太累了。
我也是看源码时看到的,所以就记录下来了。因为自己以前写过这么一个接口,现在感觉那是相当的挫啊,呵呵 |
我记得有本书是专门讲这种技巧的。大神John&Carmack当年也有很神奇的magic&number的故事。不过,我觉得如果这些工作应该交给编写底层库的人去做,如果我们每个人都要考虑这么多,就太累了。
请登录后评论。级别: 实习会员
发帖数量: 5 个
工控威望: 35 点
下载积分: 113 分
在线时间: 7(小时)
注册时间: 最后登录:
求助各位大神,三菱PLC里十六进制数转化为十进制数用什么指令,比如我的D100里面存着有H64,我想把D100里面的数据转化成K100然后存到D50里面,然后方便我做后面的乘除运算,向各位朋友请教。
级别: 家园常客
发帖数量: 656 个
工控威望: 792 点
下载积分: 2016 分
在线时间: 813(小时)
注册时间: 最后登录:
bcd转bin楼主留言:谢了,能具体点吗,真的搞不太懂了。
级别: 工控侠客
发帖数量: 774 个
工控威望: 2431 点
下载积分: 27167 分
在线时间: 859(小时)
注册时间: 最后登录:
PLC 是以2進位儲存 10進位顯示故並不存在你的問題例 :MOV&&H64&&&&D100&& =& D100&&: &&MOV&&K100&&D100&& =& D100&&: && 兩者相同
级别: 实习会员
发帖数量: 5 个
工控威望: 35 点
下载积分: 113 分
在线时间: 7(小时)
注册时间: 最后登录:
嗯嗯,谢谢。我知道PLC内部运算的时候都是以二进制运算的,但我搞的是一个485的参照MODBUS-RTU协议通讯,读回来的数据存放在D100里面,D100里面的数据也时刻在变化的,这个寄存器里面的十六进制数我想调出来,转化成常规的十进制数进一步算长度。协议格式是这样的 空闲&&&&&&&&启始位&&&&光电总数&&&&数据帧数据量&&&&遮挡最高点字节&&&&遮挡最低点字节&&&&遮挡光电总数&& 校验码&&&&&& 空闲 ≥10ms&&&&&&0x03&&&&&&&&&&&&&&78&&&&&&&&&&&&&&&&&&&&&&&& 07&&&&&&&&&&&&&&&&&&&&&&&&&&&& xx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& xx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&xx&&&&&&&&&&&&&&&&&&&&&&xx&&&&&&&&&&&&&& ≥10ms遮挡光电总数:xx,我就把他存到D100里面了,上面都是十六进制数显示的,我要调用遮挡光电总数xx,用来计算物体的长度,就是不知道怎么把遮挡光电总数xx转换为常规的十进制数进行计算了。查看: 18553|回复: 8
将十六进制字符串转换为十进制数值
阅读权限200
在程序中,我们有时需要将一个十六进制字符串转换为十进制数字。比如:
char *ptr=&0x11&;
//我们想让n等于0x11,即17
通常我们在C中,想将一个字符串转换为一整形数字,通常会使用下面的方法:char *ptr=&123&;& & & &
int n=0;
n=atoi(ptr);
printf(&%d\n&,n);
//输出:123复制代码但是atoi库函数只能将十进制字符串转化为int整形,比如下面的例子:#include &stdlib.h&
#include &stdio.h&//atoi头文件
int main(void)
& &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
*/复制代码所以要用atoi函数将&0x11&转化为十进制整形17是不行的。如果用的话,会输出下面的结果:& &
& &char *str = &0x11&;
& &n = atoi(str); //返回值n等于0 (显然不是我们想要的结果)复制代码那怎么办呢?这时有人会想,那好办,我们自己写个函数转化下就行了,比如用下面的方法:
注意:我们用VC 6.0建了一个Win32控制台程序,为了方便,程序中使用了CString类型变量,需要做一点修改。
(1)包含afx.h头文件
(2)在Project-&Settings-&General-&Mircosoft Foundation Classes中,选择Use MFC in a Shared DLL
然后我们就可以在Win32控制台下使用CString变量了,否则会出现编译错误。#include &iostream&
#include &afx.h&
int ChangeNum(CString str,int length)& &
{& &
& & & & char&&revstr[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*16;//十六进制(如果是八进制就在这里乘以8)& &
& & & & }& &
& & & && &
}
int main()
{
& & & & CString& &str=&0x11&;
& & & & int n=0;
& & & & n=ChangeNum(str,str.GetLength());
& & & & printf(&%d\n&,n);
& && &&&return 0;& & & &
}
/*输出:
&&17
*/复制代码是的,上面方法可以得到我们想要的值。还有更简单的方法吗?当然有!
方法1:#include &stdio.h&
int main()
{
& & char& &szValue[]&&=& &&0x11&;& &
& & int& & nValude& & =& &0;& && &
& & sscanf(szValue,&%x&,&nValude);& &
& & printf(&%d\n&,nValude);
& & return 0;& & & &
}
/*输出:
&&17
*/复制代码主要用到sscanf这个库函数:
函数名: sscanf
功&&能: 执行从字符串中的格式化输入
用&&法: int sscanf(char *string, char *format[,argument,...]); //%x就是我们要格式化的类型,即输出十六进制
方法2:#include &stdio.h&
#include &stdlib.h&//strtol头文件
int main()
{
& & char *p=&0x11&;& &
& & char *& &
& & int i = (int)strtol(p, &str, 16);//十六进制
& & printf(&%d\n&,i);
& & return 0;& & & &
}
/*输出:
&&17
*/复制代码主要用到strtol这个库函数,它的使用方法是:
函数名: strtol
功&&能: 将串转换为长整数
用&&法: long strtol(char *str, char **endptr, int base);//base指明我们要转换为几进制数
程序例:#include &stdlib.h&
#include &stdio.h&
int main(void)
& &char *string = &0x11&, *
& &/* strtol converts string to long integer */
& &lnumber = strtol(string, &endptr, 16);
& &printf(&string = %s&&long = %ld\n&, string, lnumber);
& &return 0;
/*输出:
&&string = 0x11 long = 17
*/复制代码在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的资源是固定的,并不随内存的扩大而扩大,所以使用完以后一定要释放。
在网上,还看到一位朋友提出一种方法,就是读写INI文件(我认为这种方法效率太低,毕竟要读写文件的),也将其摘录如下://存储HANDLE
struct Tag_STRUCT
& & {
& && &&&HWND hW
& & } ;
& & struct Tag_STRUCT S
& & Struct.hWnd = m_hW
& & //把包含句柄的结构体写入ini文件
& & WritePrivateProfileStruct(&Section&,&Key&,&Struct,sizeof(Struct),&C:\\1.ini&);
//读取HANDLE
& & struct Tag_STRUCT
& & {
& && &&&HWND hW
& & } ;
& & struct Tag_STRUCT S
& & //从包含句柄的结构体的ini文件读取HANDLE
& & GetPrivateProfileStruct(&Section&,&Key&,&Struct,sizeof(Struct),&C:\\1.ini&);复制代码以上是我目前所知道的可以将十六进制的字符串转化为整形数值的方法,可能还有更合适的方法,也请看到此篇文章的朋友帮忙留言添加,谢过!
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限60
铜牌会员, 积分 1435, 距离下一级还需 65 积分
StrToIntEx Function Converts a string representing a decimal or hexadecimal number to an integer
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限200
这个也不错,简单方便!……
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限70
银牌会员, 积分 2466, 距离下一级还需 534 积分
本帖最后由 dqf88 于
10:06 编辑
牛人大哥,怎么实现一个包含汉字和英文字母的十六进制字符串与普通字符串之间的转换呢?
“Abc中国”&------&“Abcd6d0b9fa”
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限200
十六进制字符串中只能有 0~9 和 A~F 怎么可能有汉字呢?
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限70
银牌会员, 积分 2466, 距离下一级还需 534 积分
就是将“Abc中国”转换成“Abcd6d0b9fa”,反之依然
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限70
银牌会员, 积分 2466, 距离下一级还需 534 积分
我找到了,原来就是URL编码,哈哈哈。
我是想将richedit的内容保存在数据库里,但是RTF保存汉字的时候是用16进制保存的,如果我想查找数据库的字段内容时,必须要将汉字编码,要不然就查找不到汉字,所以才有此一问。谢谢
我把代码上传了
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限60
铜牌会员, 积分 985, 距离下一级还需 515 积分
dqf88 发表于
回复 Syc 的帖子
我找到了,原来就是URL编码,哈哈哈。
richedit不是有rtf什么来的吗?可以保存信息的吧!
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限70
银牌会员, 积分 2466, 距离下一级还需 534 积分
什么意思?
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
站长提醒 /1
为了能给广大编程爱好者提供一个更好的学习交流平台,从即日起面向广大网友特举办《发原创得奖励》活动。Vip教程,驿站U盘,无线鼠标 免费送,礼品丰厚,赶快来参加吧!
VC驿站微信公众号cctry2009
Powered by Discuz! X3.3}

我要回帖

更多关于 鼻翼缩小手术做了死亡 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信