十六進(jìn)制與十進(jìn)制的互相轉(zhuǎn)換
發(fā)布時(shí)間:2008-08-09 閱讀數(shù): 次 來源:網(wǎng)樂原科技
*-- 進(jìn)制轉(zhuǎn)換: 十六進(jìn)制到十進(jìn)制
*-- 程序思路:將一個(gè)十六進(jìn)制數(shù),依次從左到右將其各自的數(shù)據(jù)乘以16的 n 次冪,
* 這里 n 的取值為:從右往左起順序排列數(shù)再減去 1, 如 123 那么1排第2位,
* 2排第1位,3排第0位, 如果有小數(shù)位,那么依次從小數(shù)點(diǎn)往后是-1、-2、-3 ...
* 當(dāng)處理 A-F 的十六進(jìn)制數(shù)時(shí),需要將他們先轉(zhuǎn)換為 10-16 的數(shù)據(jù),這里使用
* 函數(shù) asc(), asc("A") - 55 = 65 - 55 = 10, 最后是將他們的和全部加起來。
* 注意: 這里只是針對整數(shù)部分處理。
*-- 程序員: 紅虎 于 2001年5月9日
Func Hex2Dec
para tcHex
tcHex = upper(allt(tcHex))
lnLen = len(tcHex)
lnDec = 0
for n = 1 to lnLen
lcCurChr = substr(tcHex,n,1)
if lcCurChr >= "A"
lnCurNum = asc(lcCurChr) - 55
else
lnCurNum = val(lcCurChr)
endif
lnDec = lnCurNum * 16 ^ ( lnLen - n ) + lnDec
endfor
retu int(lnDec)
*-- 進(jìn)制轉(zhuǎn)換:十進(jìn)制到十六進(jìn)制
*-- 程序思路:
* 將一個(gè)十進(jìn)制數(shù) tnDec 除以16,得到的余數(shù)作為當(dāng)前值:lnCurNum,
* 判斷該數(shù)是否大于9,一般在 10 ~ 16 他們在十六進(jìn)制中的取值為 A~F
* 這里的計(jì)算可以通過ASCII碼進(jìn)行,使用函數(shù) chr(55+10) = "A",依次類推
* 將所得到的余數(shù) lcCurChr 依次排列起來即得到十六進(jìn)制結(jié)果 lcHex 。
* 而得到的商數(shù)繼續(xù)保留為 tnDec,循環(huán)繼續(xù)處理,當(dāng)商數(shù)為 0 時(shí)即退出循環(huán)。
*-- 注意: 本程序只是針對整數(shù)位處理,小數(shù)位處理是依次要乘以16,將得到的
* 整數(shù)位依次保留作為十六進(jìn)制的結(jié)果,留下的小數(shù)位繼續(xù)乘以16,循環(huán)處理
* 直到小數(shù)位為 0 時(shí)退出循環(huán)處理。
*-- 程序員: 紅虎 于 2001年5月9日
Func Dec2Hex
para tnDec
local lcHex,lnCurNum,lcCurChr
lcHex = ""
do while .T.
lnCurNum = mod(tnDec,16)
if lnCurNum > 9
lcCurChr = chr(lnCurNum + 55)
else
lcCurChr = str(lnCurNum,1)
endif
lcHex = lcCurChr + lcHex
tnDec = int(tnDec/16)
if tnDec <= 0
exit
endif
enddo
retu lcHex