找回密码
 加入
搜索
查看: 17994|回复: 19

[转贴] 从官网找来的转成二进制

  [复制链接]
发表于 2009-3-14 19:34:00 | 显示全部楼层 |阅读模式
; ==============================================================================================
; Func _NumberToBinary($iNumber)
;
; Converts a 32-bit signed or unsigned # to a binary bit string. (32-bit is AutoIT limit)
;   NOTE: range for 32-bit values is -2147483648 to 4294967295
;      Anything outside the range will return an empty string!
;
; $iNumber = # to convert, obviously
;
; Returns:
;   Success: Binary bit string
;   Failure: "" and @error set
;
; Author: Ascend4nt, with help from picaxe (Changing 'If BitAND/Else' to just one line)
;   See it @ http://www.autoitscript.com/forum/index.php?showtopic=90056
; ==============================================================================================

MsgBox(0,'',_NumberToBinary(13))

Func _NumberToBinary($iNumber)
    Local $iTopBit,$sBinString = ""
    ; Maximum 32-bit # range is -2147483648 to 4294967295   
    If $iNumber<-2147483648 Or $iNumber>4294967295 Then Return SetError(1,0,"")
    
    ; Any number <0 or >2147483647 will have the 32nd (top) bit set
    If $iNumber>2147483647 Or $iNumber<0 Then
        $iTopBit=1
    Else
        $iTopBit=0
    EndIf   

    ; Remove topbit, otherwise the function will enter an endless loop
    Local $iUnsignedNumber=BitAND($iNumber,0x7FFFFFFF)
    
    ; Cycle through each bit, shifting to the right until 0
    Do
        $sBinString = BitAND($iUnsignedNumber, 1) & $sBinString
        $iUnsignedNumber = BitShift($iUnsignedNumber, 1)
    Until Not $iUnsignedNumber

    ; PAD to 32-bits (or alternatively see below for #'s that don't need it)
    Return $iTopBit & StringRight("000000000000000000000000000000" &$sBinString,31)

; If you prefer not to pad numbers that don't need it (anything >0 and <2147483647):
#cs
    If $iTopBit Then Return $iTopBit & StringRight("000000000000000000000000000000" & $sBinString,31)
    Return $sBinString
#ce 
EndFunc   ;==>_NumberToBinary
发表于 2009-3-15 21:47:51 | 显示全部楼层
刚好用到~再找一个2进制转10进制的吧
发表于 2009-3-16 11:25:02 | 显示全部楼层
原帖由 298311657 于 2009-3-15 21:47 发表
刚好用到~再找一个2进制转10进制的吧


建议你自己写个!
发表于 2009-3-28 23:42:16 | 显示全部楼层
用是能用,不过用过后会卡一下下。还不是很完美。
发表于 2009-3-31 00:18:29 | 显示全部楼层
自己写个也不难,懂得进制转换算法就好办。以下是10<->2,16<->2,16<->10的UDF。
问题是AU3超大数的限制,还有32位数字限制。上次要写个REG_QWORD类型注册表值读写,最后还是没做好,有谁写过的能指点一下吗?


;===============================================================================
; 说明:   十进制转换为二进制
; 语法:   _DecToBinary($sDecStr[, $iLength = 0])
; 参数:   $sDecStr - 需要转换的十进制字符
;         $iLength - [可选] 返回长度
; 需要:   无
; 返回:   成功 - 二进制字符
;         失败 - 空字符 "", 并设置 @error 到 1
; 备注:   限制: 1125899906842622d / 3fffffffffffeh
;===============================================================================
Func _DecToBinary($sDecStr, $iLength = 0)
        Local $sBinStr = ""
        If NOT StringRegExp($sDecStr, "^\d+$") Then Return SetError(1, 0, "")

        If $sDecStr > 1125899906842622 Then Return SetError(1, 0, "")
        While $sDecStr > 0
                $sBinStr = Mod($sDecStr, 2) & $sBinStr
                $sDecStr = Int($sDecStr / 2)
        WEnd

        While StringLen($sBinStr) < $iLength
                $sBinStr = "0" & $sBinStr
        WEnd

        Return $sBinStr
EndFunc   ;==>_DecToBinary

;===============================================================================
; 说明:   二进制转换为十进制
; 语法:   _BinaryToDec($sBinStr)
; 参数:   $sBinStr - 需要转换的二进制字符
; 需要:   无
; 返回:   成功 - 十进制整数
;         失败 - 空字符 "", 并设置 @error 到 1
; 备注:   限制: 9223372036854775807d / 7fffffffffffffffh / [01]{1,63}b
;         注意: 输入超过 999999999999999d / 38d7ea4c67fffh 将输出指数形式
;===============================================================================
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

;===============================================================================
; 说明:   十六进制转换为二进制
; 语法:   _HexToBinary($sHexStr[, $iLength = 0])
; 参数:   $sHexStr - 需要转换的十六进制字符
;         $iLength - [可选] 返回长度
; 需要:   无
; 返回:   成功 - 二进制字符
;         失败 - 空字符 "", 并设置 @error 到 1
; 备注:   限制: 输出最大 2147483647 个字符
;===============================================================================
Func _HexToBinary($sHexStr, $iLength = 0)
        Local $sBinStr = ""
        If NOT StringRegExp($sHexStr, "^[0-9A-Fa-f]+$") Then Return SetError(1, 0, "")

        $sHexStr = StringUpper($sHexStr)
        For $i = 1 To StringLen($sHexStr)
                Switch StringMid($sHexStr, $i, 1)
                        Case "0"
                                $sBinStr &= "0000"
                        Case "1"
                                $sBinStr &= "0001"
                        Case "2"
                                $sBinStr &= "0010"
                        Case "3"
                                $sBinStr &= "0011"
                        Case "4"
                                $sBinStr &= "0100"
                        Case "5"
                                $sBinStr &= "0101"
                        Case "6"
                                $sBinStr &= "0110"
                        Case "7"
                                $sBinStr &= "0111"
                        Case "8"
                                $sBinStr &= "1000"
                        Case "9"
                                $sBinStr &= "1001"
                        Case "A"
                                $sBinStr &= "1010"
                        Case "B"
                                $sBinStr &= "1011"
                        Case "C"
                                $sBinStr &= "1100"
                        Case "D"
                                $sBinStr &= "1101"
                        Case "E"
                                $sBinStr &= "1110"
                        Case "F"
                                $sBinStr &= "1111"
                EndSwitch
        Next

        If $iLength = 0 Then
                While StringLeft($sBinStr, 1) = "0"
                        $sBinStr = StringTrimLeft($sBinStr, 1)
                WEnd
        Else
                For $i = 1 To $iLength - StringLen($sBinStr)
                        $sBinStr = "0" & $sBinStr
                Next
        EndIf

        Return $sBinStr
EndFunc   ;==>_HexToBinary

;===============================================================================
; 说明:   二进制转换为十六进制
; 语法:   _BinaryToHex($sBinStr[, $iLength = 0])
; 参数:   $sBinStr - 需要转换的二进制字符
;         $iLength - [可选] 返回长度
; 需要:   无
; 返回:   成功 - 十六进制字符
;         失败 - 空字符 "", 并设置 @error 到 1
; 备注:   限制: 输入最大 2147483647 个字符
;===============================================================================
Func _BinaryToHex($sBinStr, $iLength = 0)
        Local $sHexStr = ""
        If NOT StringRegExp($sBinStr, "^[01]+$") Then Return SetError(1, 0, "")

        While Mod(StringLen($sBinStr), 4)
                $sBinStr = "0" & $sBinStr
        WEnd
        For $i = 1 To StringLen($sBinStr) Step 4
                Switch StringMid($sBinStr, $i, 4)
                        Case "0000"
                                $sHexStr &= "0"
                        Case "0001"
                                $sHexStr &= "1"
                        Case "0010"
                                $sHexStr &= "2"
                        Case "0011"
                                $sHexStr &= "3"
                        Case "0100"
                                $sHexStr &= "4"
                        Case "0101"
                                $sHexStr &= "5"
                        Case "0110"
                                $sHexStr &= "6"
                        Case "0111"
                                $sHexStr &= "7"
                        Case "1000"
                                $sHexStr &= "8"
                        Case "1001"
                                $sHexStr &= "9"
                        Case "1010"
                                $sHexStr &= "A"
                        Case "1011"
                                $sHexStr &= "B"
                        Case "1100"
                                $sHexStr &= "C"
                        Case "1101"
                                $sHexStr &= "D"
                        Case "1110"
                                $sHexStr &= "E"
                        Case "1111"
                                $sHexStr &= "F"
                EndSwitch
        Next

        If $iLength = 0 Then
                While StringLeft($sHexStr, 1) = "0"
                        $sHexStr = StringTrimLeft($sHexStr, 1)
                WEnd
        Else
                For $i = 1 To $iLength - StringLen($sHexStr)
                        $sHexStr = "0" & $sHexStr
                Next
        EndIf

        Return $sHexStr
EndFunc   ;==>_BinaryToHex

;===============================================================================
; 说明:   十六进制转换为十进制
; 语法:   _HexToDec($sHexStr)
; 参数:   $sHexStr - 需要转换的十六进制字符
; 需要:   无
; 返回:   成功 - 十进制整数
;         失败 - 空字符 "", 并设置 @error 到 1
; 备注:   注意: 输入超过 999999999999999d / 38d7ea4c67fffh 将输出指数形式
;===============================================================================
Func _HexToDec($sHexStr)
        Local $sDecStr = 0
        If NOT StringRegExp($sHexStr, "^[0-9A-Fa-f]+$") Then Return SetError(1, 0, "")

        $sHexStr = StringUpper($sHexStr)
        For $i = 1 To StringLen($sHexStr)
                Switch StringMid($sHexStr, StringLen($sHexStr) - $i + 1, 1)
                        Case "0"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 0
                        Case "1"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 1
                        Case "2"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 2
                        Case "3"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 3
                        Case "4"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 4
                        Case "5"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 5
                        Case "6"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 6
                        Case "7"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 7
                        Case "8"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 8
                        Case "9"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 9
                        Case "A"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 10
                        Case "B"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 11
                        Case "C"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 12
                        Case "D"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 13
                        Case "E"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 14
                        Case "F"
                                $sDecStr = $sDecStr + 16 ^ ($i - 1) * 15
                EndSwitch
        Next

        Return $sDecStr
EndFunc   ;==>_HexToDec

;===============================================================================
; 说明:   十进制转换为十六进制
; 语法:   _DecToHex($sDecStr[, $iLength = 0])
; 参数:   $sDecStr - 需要转换的十进制字符
;         $iLength - [可选] 返回长度
; 需要:   无
; 返回:   成功 - 十六进制字符
;         失败 - 空字符 "", 并设置 @error 到 1
; 备注:   限制: 1125899906842622d / 3fffffffffffeh
;===============================================================================
Func _DecToHex($sDecStr, $iLength = 0)
        Local $sHexStr = "", $sResult
        If NOT StringRegExp($sDecStr, "^\d+$") Then Return SetError(1, 0, "")

        If $sDecStr > 1125899906842622 Then Return SetError(1, 0, "")
        While $sDecStr > 0
                $sResult = Mod($sDecStr, 16)
                Switch $sResult
                        Case "10"
                                $sResult = "A"
                        Case "11"
                                $sResult = "B"
                        Case "12"
                                $sResult = "C"
                        Case "13"
                                $sResult = "D"
                        Case "14"
                                $sResult = "E"
                        Case "15"
                                $sResult = "F"
                EndSwitch
                $sHexStr = $sResult & $sHexStr
                $sDecStr = Int($sDecStr / 16)
        WEnd

        While StringLen($sHexStr) < $iLength
                $sHexStr = "0" & $sHexStr
        WEnd

        Return $sHexStr
EndFunc   ;==>_DecToHex
发表于 2009-5-27 15:14:56 | 显示全部楼层
受教了,我需要的……
发表于 2009-6-3 11:01:10 | 显示全部楼层
发表于 2010-2-9 16:41:00 | 显示全部楼层
看一下,谢谢
发表于 2010-2-25 16:24:02 | 显示全部楼层
新手学习下
发表于 2011-1-1 21:29:44 | 显示全部楼层
认真学习一下!
发表于 2011-1-2 01:07:13 | 显示全部楼层
不错不错 ,感谢分享, 呵呵
发表于 2011-1-2 01:13:30 | 显示全部楼层
已经下载,感谢分享, 呵呵
发表于 2011-1-2 01:13:48 | 显示全部楼层
缺钱啊   能不能不要钱啊
发表于 2011-1-2 01:14:12 | 显示全部楼层
没办法啊,唉  要下载资源不容易啊
发表于 2011-1-2 01:14:38 | 显示全部楼层
谢谢分享东西,取消收费就好了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 03:27 , Processed in 0.085175 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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