【CBM666 十六进制数值的转换】
vb吧
全部回复
仅看楼主
level 13
cbm666 楼主
我们知道16进制的元素是0123456789ABCDEF 总共16个元素的集合,我们经常需要将16进制换算为10进制或2进制,尤其是串口或网口通讯, VB6提供了Hex函数 能将10进制数值转换为16进制, 但是VB6却没有提供如何将16进制转换为10进制数值的函数, 如何计算这个数值, 下面列出计算式便可明白了
例如: 16进制 【1234ABCD】 换算为10进制数值的计算式:
0123456789当大于9时 就转为ABCDEF来替代 A=10 B=11 C=12 D=13 E=14 F=15
Tval = 1 * 16 ^ 7 + 2 * 16 ^ 6 + 3 * 16 ^ 5 + 4 * 16 ^ 4 + 10 * 16 ^ 3 + 11 * 16 ^ 2 + 12 * 16 ^ 1 + 13 * 16 ^ 0
MsgBox Tval 将返回 305441741
Tval 就是1234ABCD的10进制数值
再将10进制数值还原回来就很简单了, 只要使用VB6自带的函数Hex即可
MsgBox Hex(Tval) 将返回 305441741
再举一个例 FFFFFFFF
F 的10进制值 = 15
例如: 16进制 【FFFFFFFF】 换算为10进制数值的计算式:
Tval = 15 * 16 ^ 7 + 15 * 16 ^ 6 + 15 * 16 ^ 5 + 15 * 16 ^ 4 + 15 * 16 ^ 3 + 15 * 16 ^ 2 + 15 * 16 ^ 1 + 15* 16 ^ 0
MsgBox Tval 将返回 4294967295
MsgBox Hex(Tval) 将返回 FFFFFFFF
2017年07月26日 23点07分 1
level 13
cbm666 楼主
MsgBox Hex(Tval) 将返回 305441741
改为
MsgBox Hex(Tval) 将返回 1234ABCD
2017年07月27日 00点07分 2
level 15
如果是这样的话.那将十进制数的浮点数转为十六进制呢?有没有快速的方法来解决?然后再将浮点型的十六进制数转为十进制呢?又是否有快速的方法?
2017年07月27日 00点07分 4
浮点型16进制数值转换可以用IEEE754算法 使用CopyMemory这个API来算即可
2017年07月27日 01点07分
@cbm666 能找到的分享比较少这个算法,好多c的代码。
2017年07月27日 02点07分
level 13
cbm666 楼主
举个例子 将 0*C1480000
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Command1_Click()
MsgBox Hex2Dec("C1480000") '返回 -12.5
End Sub
Public Function Hex2Dec(Hstr As String) As Single
' 将十六进制转化成十进制浮点数
Dim L As Long, f As Single, DecVal!
L = Val("&H" & Hstr)
CopyMemory f, L, 4
Hex2Dec = Format(f, "0.00")
End Function
2017年07月27日 01点07分 5
0xC1480000
2017年07月27日 01点07分
As Any 这个东西似乎不通用。我在电子表格之中它还是要求要和数据类型对上号
2017年07月31日 06点07分
level 13
10转16不麻烦,16转10麻烦
2017年07月27日 06点07分 7
理解上相反,感觉10转16很是麻烦,16转10很简单。只是操作上却反过来了。
2017年07月31日 06点07分
@冼天 10转16直接读取内存的就是了,16转10的话你得自己算
2017年07月31日 14点07分
level 15
如果是8位以内的有符号十六进制数(比如n="1234ABCD"),那么用表达式Val("&H" & n & "&")就可以返回其对应的十进制数305441741
但如果十六进制数超过8位,或者需要返回无符号的数值,那么这个转换还是有意义的
2017年07月27日 07点07分 8
非也 我用1234ABCD为例,只是方便理解 你换上其它字符看看. 一般我会用CLng来转换10进制 我不会用VAL函数来转换
2017年07月27日 07点07分
必须理解计算式 否则你反回的8个字节不会是正确地数值
2017年07月27日 07点07分
@cbm666 我看是你自己没有理解吧?还8个字节?1个字节等于2个十六进制位好么?为什么8位以内十六进制数才能用VB自带的方法转换(不论是用Val还是CLng),那是因为在VB【代码】中,十六进制的表示形式只能用来表示整数,最多不会超过Long型(4个字节),即8位十六进制
2017年07月27日 07点07分
@初音✨七奈 呵呵 我不懂你懂 行吗?你用VAL去看看 &HFFFFFFFF返回多少
2017年07月27日 08点07分
1