proc dec2hex {value} {
# Creates a 32 bit hex number from a signed decimal number
# Replace all non-decimal characters
regsub -all {[^0-9\.\-]} $value {} newtemp
set value [string trim $newtemp]
if {$value < 2147483647 && $value > -2147483648} {
set tempvalue [format "%#010X" [expr $value]]
return [string range $tempvalue 2 9]
} elseif {$value < -2147483647} {
return "80000000"
} else {
return "7FFFFFFF"
}
}
proc dec2hex16 {value} {
# Creates a 16 bit hex number from a signed decimal number
# Replace all non-decimal characters
regsub -all {[^0-9\.\-]} $value {} newtemp
set value [string trim $newtemp]
if {$value < 32767 && $value > -32768} {
set tempvalue [format "%#010X" [expr $value]]
return [string range $tempvalue 6 9]
} elseif {$value < -32767} {
return "8000"
} else {
return "7FFF"
}
}
proc hex2dec {hexvalue} {
# Creates an unsigned decimal number from a 63 bit hex value
set total "0000000000000000"
set mask "7FFFFFFF"
# replace from the end
set start 15
# Replace all non-hex characters
regsub -all {[^0-9A-F\.\-]} $hexvalue {} newtemp
set hexvalue [string trim $newtemp]
# Go from the end to the start
for {set i [expr [string length $hexvalue] -1]} {$i > -1} {incr i -1} {
# Get the next hex digit
set j [string toupper [string index $hexvalue $i]]
# Add it to the big string
set total [string replace $total $start $start $j]
incr start -1
}
set nlower [string range $total 8 15]
set nupper [string range $total 0 7]
# clear top bit to keep as positive. Also adds in "0x" at the start
set nupper "[format "%#010X" [expr "0x$nupper" & "0x$mask"]]"
# Now set to 64 bit - use a string to represent the number to avoid integer size limits
set total "[expr [format "%u" "0x$nlower"] + (4294967295 * [format "%u" "$nupper"])]"
return $total
}
proc uhex2dec32 {hexvalue} {
# Creates an unsigned decimal number from a 32 bit hex value
# Replace all non-hex characters
regsub -all {[^0-9A-F\.\-]} $hexvalue {} newtemp
set hexvalue [string trim $newtemp]
#trim to 8 characters
set hexvalue [string range $hexvalue [expr [string length $hexvalue]
- 8] [expr [string length $hexvalue] - 1]]
return [format "%#u" [expr "0x$hexvalue"]] } proc shex2dec32 {hexvalue} {
# Creates a signed decimal number from a 32 bit hex value
# Replace all non-hex characters
regsub -all {[^0-9A-F\.\-]} $hexvalue {} newtemp
set hexvalue [string trim $newtemp]
#trim to 8 characters
set hexvalue [string range $hexvalue [expr [string length $hexvalue]
- 8] [expr [string length $hexvalue] - 1]]
return [format "%#i" [expr "0x$hexvalue"]] }
proc uhex2dec16 {hexvalue} {
# Creates an unsigned decimal number from a 16 bit hex value
# Replace all non-hex characters
regsub -all {[^0-9A-F\.\-]} $hexvalue {} newtemp
set hexvalue [string trim $newtemp]
#trim to 4 characters
set hexvalue [string range $hexvalue [expr [string length $hexvalue]
- 4] [expr [string length $hexvalue] - 1]]
set value [format "%#u" [expr "0x$hexvalue"]]
return $value
}
proc shex2dec16 {hexvalue} {
# Creates an unsigned decimal number from a 16 bit hex value
# Replace all non-hex characters
regsub -all {[^0-9A-F\.\-]} $hexvalue {} newtemp
set hexvalue [string trim $newtemp]
#trim to 4 characters
set hexvalue [string range $hexvalue [expr [string length $hexvalue]
- 4] [expr [string length $hexvalue] - 1]]
# Convert to signed number
set value [format "%#u" [expr "0x$hexvalue"]]
if {$value > 32767} {
set value [expr ($value - 65536)]
}
return $value
}