Version 2 of Comp3 data conversion

Updated 2009-03-24 14:40:07 by suchenwi

Function to convert comp3 packed decimal data (see [L1 ] to a string.

Note: This function assumes it's signed data.

 proc comp3tostring {packed_dec_data data_len} {
    set val 0
    set ret_sign {}

    for {set byte_ndx 0} {$byte_ndx < $data_len} {incr byte_ndx} {
       scan [string index $packed_dec_data $byte_ndx] %c byte
       set byte [format "%02.2x" $byte]
       if {$byte_ndx == [expr {$data_len - 1}]} {
          append val [format "%x" [string index $byte 0]]
          if {[string index $byte 1] == {d}} {
             set ret_sign {-}
          }
       } else {
          append val "[format "%x%x" [string index $byte 0] [string index $byte 1]]"
       }
    }

    return "$ret_sign$val"
 }

RS 2009-03-24: Here's a simpler alternative:

 proc comp3int x {
    binary scan $x H* hex
    scan $hex %d int
    switch -- [string index $hex end] {
       c {}
       d {set int -$int}
       default {return -code error "bad comp3 number: $x"}
    }
    return $int
 }