找回密码
 加入
搜索
查看: 1785|回复: 3

[网络通信] 16进制转10进制算法(已解决)

[复制链接]
发表于 2019-12-30 10:55:36 | 显示全部楼层 |阅读模式
本帖最后由 fuldho 于 2019-12-30 11:35 编辑

最近看磁盘分区表,关于16进制转10进制计算,(36 C1 C0 08)表示当前分区大小,应为低位在前,交换为0x08C0C136 ,
高地位交换再转换为10进制,各位大仙有较为简单算法。

发表于 2019-12-30 11:10:21 | 显示全部楼层
Global $hData = '36C1C008'
Global $iEx, $iIntData, $fData
Global $iDec

For $i = StringLen($hData) - 1 To 1 Step -2
        $fData &= StringMid($hData, $i, 2)
Next

$hData = _NumberToBinary('0x' & $fData)
ConsoleWrite($hData & @CRLF)
$iEx = _BinaryToDec(StringMid($hData, 2, 8)) - 127

For $i = 23 To $iEx
        $hData &= '0'
Next
$iIntData = '1' & StringMid($hData, 10, $iEx)
$iDec = _BinaryToDec($iIntData) + switchbinary(StringMid($hData, $iEx + 10))
MsgBox(0, 0, $iDec)

Func switchbinary($data)
        Local $iRet = 0
        Local $Len = StringLen($data)
        For $i = $Len To 1 Step -1
                $iS = Number(StringMid($data, $i, 1)) * 2 ^ (-1 * $i)
                $iRet += $iS
        Next
        Return StringFormat('%.02f', $iRet)
EndFunc   ;==>switchbinary

Func _NumberToBinary($iNumber)
        Local $iTopBit, $sBinString = ""
        If $iNumber < -2147483648 Or $iNumber > 4294967295 Then Return SetError(1, 0, "")
        If $iNumber > 2147483647 Or $iNumber < 0 Then
                $iTopBit = 1
        Else
                $iTopBit = 0
        EndIf
        Local $iUnsignedNumber = BitAND($iNumber, 0x7FFFFFFF)
        Do
                $sBinString = BitAND($iUnsignedNumber, 1) & $sBinString
                $iUnsignedNumber = BitShift($iUnsignedNumber, 1)
        Until Not $iUnsignedNumber
        Return $iTopBit & StringRight("000000000000000000000000000000" & $sBinString, 31)
EndFunc   ;==>_NumberToBinary

Func _BinaryToDec($sBinStr)
        Local $sDecStr = 0
        If Not StringRegExp($sBinStr, "^[01]{1,63}$") Then Return SetError(1, 0, "")
        For $i = 1 To StringLen($sBinStr)
                $sDecStr = $sDecStr * 2 + StringMid($sBinStr, $i, 1)
        Next
        Return $sDecStr
EndFunc   ;==>_BinaryToDec

评分

参与人数 1金钱 +10 收起 理由
fuldho + 10 赞一个!

查看全部评分

发表于 2019-12-30 11:16:03 | 显示全部楼层

Local $sStr = '36 C1 C0 08'
$sStr = StringRegExpReplace($sStr,'\W','')
Local $sRet = StringRegExpReplace($sStr,'(..)(..)(..)(..)','0x${4}${3}${2}${1}')
MsgBox(0,$sRet,Dec(Hex($sRet)))



评分

参与人数 1金钱 +40 收起 理由
fuldho + 40 很给力!

查看全部评分

 楼主| 发表于 2019-12-30 11:29:00 | 显示全部楼层
非常的给力,再次谢谢
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 08:48 , Processed in 0.072140 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表