求一个16vb十进制转十六进制进制的vb代码,要支持非常大的数的(30位)

查看: 5986|回复: 9
16位的十六进制怎么转化成十进制?(急)
阅读权限10
在线时间 小时
16位的十六进制怎么转化成十进制?
阅读权限20
在线时间 小时
& & valHex = &&H& & &1A&
& & a = CLng(valHex)
& & Debug.Print a
只能转化Long长整型数据范围对象&
阅读权限95
在线时间 小时
本帖最后由 bluexuemei 于
06:54 编辑
Sub t()
Set ojs = CreateObject(&scriptcontrol&): ojs.Language = &jscript&
tennum = parseInt(sixteennum, 16)
Set ojs = Nothing
End Sub复制代码
阅读权限95
在线时间 小时
本帖最后由 香川群子 于
09:47 编辑
16位的16进制数?
比如: AEC1 23BD 24A1 E347
转换后= 12,592,385,328,374,997,831&&是一个20位的10进制数了。(起码是19位的数)
下面是对照表:
1& && &&&0& && &&&1
2& && &&&1& && &&&16
3& && &&&2& && &&&256
4& && &&&3& && &&&4096
5& && &&&4& && &&&65536
6& && &&&5& && &&&1048576
7& && &&&6& && &&&
8& && &&&7& && &&&
9& && &&&8& && &&&
10& && &&&9& && &&&
11& && &&&10& && &&&6
12& && &&&11& && &&&16
13& && &&&12& && &&&656
14& && &&&13& && &&&0496
15& && &&&14& && &&&27936
16& && &&&15& && &&&6846976
如果是自己计算,那么需要长数位计算能力。
阅读权限95
在线时间 小时
好了,发现CDec足够可以用。Sub test()
& & MsgBox f(&AEC1 23BD 24A1 E347&)
& & '12,592,385,328,374,997,831
End Sub
Function f(H)
& & srr = Array(&1&, &16&, &256&, &4096&, &65536&, &1048576&, &&, &&, &&, &&, &6&, &16&, &656&, &0496&, &27936&, &6846976&)
& & H = Replace(H, & &, &&): n = Len(H)
& & For i = 1 To n
& && &&&t = Mid(H, i, 1): If t & 9 Then t = Asc(UCase(t)) - 55
& && &&&For j = 1 To t
& && && && &s = s + CDec(srr(n - i))
& && &&&Next
& & Next
& & f = Format(s, &#,##0&)
End Functio复制代码原理,预先计算好16的0-15次幂的结果,
然后把16位的16进制数 循环相加就可以了。
计算时不能使用Long类型,只能使用CDec()函数转为 十进制数进行计算。
阅读权限95
在线时间 小时
本帖最后由 香川群子 于
10:29 编辑
如果16的0-15次幂的结果也自己算的话……Function f(H)
& & H = Replace(H, & &, &&): n = Len(H)
& & ReDim srr$(n - 1) '按实际数位长度n 计算16的 0 - n-1次幂值
& & t = CDec(1): s = t: srr(0) = 1
& & For i = 1 To n - 1
& && &&&For j = 1 To 15
& && && && &s = s + t
& && &&&Next
& && &&&srr(i) = s: t = s
& & Next
& &
& & s = 0
& & For i = 1 To n
& && &&&t = Mid(H, i, 1): If t & 9 Then t = Asc(UCase(t)) - 55 '字母A-F转为10-15
& && &&&For j = 1 To t
& && && && &s = s + CDec(srr(n - i))
& && &&&Next
& & Next
& & f = Format(s, &#,##0&)
End Function复制代码
阅读权限95
在线时间 小时
本帖最后由 香川群子 于
10:58 编辑
补充,根据CDec的允许范围,最大可以计算到 24位的16进制数。
MsgBox f(&FFFF FFFF FFFF FFFF FFFF FFFF&) = 79,228,162,514,264,337,593,543,950,335
阅读权限95
在线时间 小时
转换为不大于24位的16进制的自定义函数:
实际上由于内置运算精度的限制,
只能计算小于等于 99999 的十进制数字 转换为 FFFFFFFFFFFF5BFF62D2A5FFFunction ff(D)
& & n = Int(Log(D) / Log(16)) + 1: If n & 24 Then ff = &Len =& & n & & &24 Err!&: Exit Function
& & ReDim srr$(n - 1)
& & t = CDec(1): s = t: srr(0) = 1
& & For i = 1 To n - 1
& && &&&For j = 1 To 15
& && && && &s = s + t
& && &&&Next
& && &&&srr(i) = s: t = s
& & Next
& &
& & s = CDec(D)
& & For i = 1 To n
& && &&&t = CDec(srr(n - i))
& && &&&For j = 0 To 15
& && && && &If s & t Then Exit For Else s = s - t
& && &&&Next
& && &&&ff = ff & IIf(j & 9, Chr(j + 55), j)
& & Next
End Function复制代码
阅读权限10
在线时间 小时
& & & & & & & &
香川群子,厉害!!
阅读权限95
在线时间 小时
本帖最后由 香川群子 于
16:19 编辑
tomyi 发表于
& & valHex = &&H& & &1A&
你的代码改成自定义函数:
Function f(h)
& & f = CLng(&&H& & h)
End Function
只能计算Long整型数值对应的十六进制的数,首先,从
到 7FFF FFFF&&为非负数&&即 0 到
到 FFFF FFFF&&为负数& &即 - 到 -1
最新热点 /1
ExcelHome每周都有线上直播公开课,
国内一流讲师真身分享,高手贴身答疑,
赶不上直播还能看录像,
关键居然是免费的!
厚木哥们都已经这么努力了,
你还好意思说学不好Office。
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师将一个十六进制字符串转换为十进制数值的问题 - DoubleLi - 博客园
在程序中,我们有时需要将一个十六进制字符串转换为十进制数字。比如:char *ptr="0x11";int n=0;//我们想让n等于0x11,即17
通常我们在C中,想将一个字符串转换为一整形数字,通常会使用下面的方法:
char&*ptr="123";&&&&&&
int&n=0;&&
n=atoi(ptr);&&
printf("%d/n",n);&&
但是atoi库函数只能将十进制字符串转化为int整形,比如下面的例子:
#include&&stdlib.h&&&&
#include&&stdio.h&//atoi头文件&&&
int&main(void)&&&
&&&int&n;&&&
&&&char&*str&=&"12345.67";&&&
&&&n&=&atoi(str);&
&&&printf("string&=&%s&integer&=&%d/n",&str,&n);&&&
&&&return&0;&&&
所以要用atoi函数将"0x11"转化为十进制整形17是不行的。如果用的话,会输出下面的结果:
char&*str&=&"0x11";&&&
n&=&atoi(str);&
那怎么办呢?这时有人会想,那好办,我们自己写个函数转化下就行了,比如用下面的方法:注意:我们用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;
&&&&&&&&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;
&&&&}&&&&&
&&&&return&&&&&&
int&main()&&
&&&&CString&&&str="0x11";&&&
&&&&int&n=0;&&
&&&&n=ChangeNum(str,str.GetLength());&&
&&&&printf("%d/n",n);&&
&&&&&&&&return&0;&&&&&
是的,上面方法可以得到我们想要的值。还有更简单的方法吗?当然有!
#include&&stdio.h&&&
int&main()&&
&&&&char&&&szValue[]&&=&&&"0x11";&&&&&
&&&&int&&&&nValude&&&&=&&&0;&&&&&&&&&
&&&&sscanf(szValue,"%x",&nValude);&&&&&
&&&&printf("%d/n",nValude);&&
&&&&return&0;&&&&&
主要用到sscanf这个库函数:函数名: sscanf&功& 能: 执行从字符串中的格式化输入&用& 法: int sscanf(char *string, char *format[,argument,...]); //%x就是我们要格式化的类型,即输出十六进制
#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;&&&&&
主要用到strtol这个库函数,它的使用方法是:
函数名: strtol&功& 能: 将串转换为长整数&用& 法: long strtol(char *str, char **endptr, int base);//base指明我们要转换为几进制数程序例:
#include&&stdlib.h&&&&
#include&&stdio.h&&&&
int&main(void)&&&
&&&char&*string&=&"0x11",&*&&&
&&&long&&&&
&&&lnumber&=&strtol(string,&&endptr,&16);&&&
&&&printf("string&=&%s&&long&=&%ld/n",&string,&lnumber);&&&
&&&return&0;&&&
在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文件(我认为这种方法效率太低,毕竟要读写文件的),也将其摘录如下:
struct&Tag_STRUCT&&
&&&&&&&&HWND&hW&&
&&&&struct&Tag_STRUCT&S&&
&&&&Struct.hWnd&=&m_hW&&
&&&&WritePrivateProfileStruct("Section","Key",&Struct,sizeof(Struct),"C://1.ini");&&
&&&&struct&Tag_STRUCT&&
&&&&&&&&HWND&hW&&
&&&&struct&Tag_STRUCT&S&&
&&&&GetPrivateProfileStruct("Section","Key",&Struct,sizeof(Struct),"C://1.ini");&&
以上是我目前所知道的可以将十六进制的字符串转化为整形数值的方法,可能还有更合适的方法,也请看到此篇文章的朋友帮忙留言添加,谢过!2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2010年11月 总版技术专家分月排行榜第二2010年9月 总版技术专家分月排行榜第二2010年8月 总版技术专家分月排行榜第二
2010年7月 总版技术专家分月排行榜第三
2010年11月 总版技术专家分月排行榜第二2010年9月 总版技术专家分月排行榜第二2010年8月 总版技术专家分月排行榜第二
2010年7月 总版技术专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。(window.slotbydup = window.slotbydup || []).push({
id: '4540180',
container: s,
size: '250,200',
display: 'inlay-fix'
热门资料排行
添加成功至
资料评价:
所需积分:0VB编程序实现十进制数转换成2、8、16进制数_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
VB编程序实现十进制数转换成2、8、16进制数
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 vb二进制转字符 的文章

更多推荐

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

点击添加站长微信