Richard Suchenwirth 2006-12-06 - Here's a way of converting an ASCII string of up to 9 characters from and to a wide integer, in which a sequence of 7 bits corresponds to one character. 7*9 = 63, so the integers will always be non-negative, as the sign bit is always 0:
proc base128'encode str { if {[string length $str]>9} {error "string must be 0..9 characters long"} set res 0 foreach c [split $str ""] { set res [expr {wide($res)<<7 | [scan $c %c]%128}] } set res } proc base128'decode int { set res "" while {$int != 0} { set res [format %c [expr {$int % 128}]]$res set int [expr {$int >> 7}] } set res }
Examples:
% base128'encode "" 0 % base128'encode hello 28130883183 % base128'encode "Tcl & Tk" 47726922213894763 % base128'decode 47726922213894763 Tcl & Tk