else if( typeId == asTYPEID_UINT8 )
s << *(unsigned char*)value;
The string ending up in s is not the decimal string representation of <value>. Instead, the value of 'value' is added as binary data to the string (which results in random charaters being output by the debugger instead).
Adding a cast to unsigned int helps:
else if( typeId == asTYPEID_UINT8 )
s << (unsigned int)(*(unsigned char*)value);
Observed this using VC++ 2008
Cheers