2010年4月2日金曜日

Tcl ビットマスク処理する

hex2binで16進数を4桁の2進数へ変換する

proc ANDMask args {
    set data [hex2bin [lindex $args 0]]
    set mask [hex2bin [lindex $args 1]]
    set maskLength [string length $mask]

    set dataList [splitRange $data $maskLength]
    set result ""
   
    foreach buffer $dataList {
        for {set index 0} {$index < $maskLength} {incr index} {
            set dataBit [string range $buffer $index $index]
            set maskBit [string range $mask $index $index]

            #マスク対象のデータがなくなったら終了
            if {[string length $dataBit] != 0} {
                append result [expr $dataBit && $maskBit]
            } else {break}
            #puts "DEBUG dataBit:$dataBit maskBit:$maskBit result:[string range $result end end]"
        }
    }

    return [bin2hex $result]
}

proc ORMask args {
    set data [hex2bin [lindex $args 0]]
    set mask [hex2bin [lindex $args 1]]
    set maskLength [string length $mask]

    set dataList [splitRange $data $maskLength]
    set result ""
   
    foreach buffer $dataList {
        for {set index 0} {$index < $maskLength} {incr index} {
            set dataBit [string range $buffer $index $index]
            set maskBit [string range $mask $index $index]

            #マスク対象のデータがなくなったら終了
            if {[string length $dataBit] != 0} {
                append result [expr $dataBit || $maskBit]
            } else {break}
            #puts "DEBUG dataBit:$dataBit maskBit:$maskBit result:[string range $result end end]"
        }
    }

    return [bin2hex $result]
}