Posted to tcl by crshults at Thu May 28 19:49:01 GMT 2015view pretty

proc lpop {the_list {number_to_pop 1}} {
    upvar 1 $the_list local_list
    set pop_list [lrange $local_list 0 $number_to_pop-1]
    set local_list [lrange $local_list $number_to_pop end]
    return $pop_list
}

proc convert_binary_to_bit_list {input} {
    binary scan $input B* bit_string
    split $bit_string ""
}

proc bassign {input fields_and_lengths} {
    set bit_list [convert_binary_to_bit_list $input]
    foreach {field length} $fields_and_lengths {
        uplevel "scan [join [lpop bit_list $length] ""] %b $field"
    }
    return [binary format B* [join $bit_list ""]]
}

#example:
bassign \xfc\x1d {header 4 length 4 data 7 parity 1}

puts $header
puts $length
puts $data
puts $parity