All pastes #395859 Raw Edit

Stuff

public text v1 · immutable
·published 2007-03-15 10:33 UTC
rendered paste body
void Hex16String2RawBuffer( const char * pszASCIIEncodedRawBuffer, unsigned char * pszByteRawBuffer, size_t nOutputLength )
{
    size_t nInputLength = ::strlen( pszASCIIEncodedRawBuffer );
    //! If buffer is not the exact multiple of 2, please report it immediatelly
    if( nInputLength %2 != 0 )
        throw std::runtime_error( "Odd size of buffer. Buffer size must be even." );
    if( nInputLength / 2 > nOutputLength )
        throw std::runtime_error( "Invalid output buffer size." );

    unsigned char * pszOutputBegin = pszByteRawBuffer;
    unsigned char * pszOutputEnd = pszByteRawBuffer + nOutputLength;

    const size_t nChunkSize = 4;
    int nBytes[ nChunkSize ] = { 0 } ;

    size_t nNumberOfChunks = nOutputLength / nChunkSize;
    size_t nReminder = nOutputLength % nChunkSize;

    for( size_t nIndex = 0  ; nIndex < nNumberOfChunks ; ++nIndex ) 
    {
        int nFieldsParsed = ::sscanf( pszASCIIEncodedRawBuffer, "%2x%2x%2x%2x",  &nBytes[ 0 ],  &nBytes[ 1 ], &nBytes[ 2 ],  &nBytes[ 3 ] );
        if( nFieldsParsed == 4 )
        {
            *pszOutputBegin++ = ( unsigned char ) nBytes[ 0 ];
            *pszOutputBegin++ = ( unsigned char ) nBytes[ 1 ];
            *pszOutputBegin++ = ( unsigned char ) nBytes[ 2 ];
            *pszOutputBegin++ = ( unsigned char ) nBytes[ 3 ];
            pszASCIIEncodedRawBuffer += 8; 
        }        
        else
        {
            throw std::runtime_error( "Failed with conversion at position..." );
        }
    }
    switch( nReminder )
    {
    case 1:
        {
            int nFieldsParsed = ::sscanf( pszASCIIEncodedRawBuffer, "%2x", 
                &nBytes[ 0 ] );
                if( nFieldsParsed == 1 )
                {
                    *pszOutputBegin++ = ( unsigned char ) nBytes[ 0 ];
                }        
                else
                {
                    throw std::runtime_error( "Failed with conversion at position..." );
                }
        }
        break;
    case 2: 
        {
            int nFieldsParsed = ::sscanf( pszASCIIEncodedRawBuffer, "%2x%2x", 
                &nBytes[ 0 ], 
                &nBytes[ 1 ] );
            if( nFieldsParsed == 2 )
            {
                *pszOutputBegin++ = ( unsigned char ) nBytes[ 0 ];
                *pszOutputBegin++ = ( unsigned char ) nBytes[ 1 ];
            }        
            else
            {
                throw std::runtime_error( "Failed with conversion at position..." );
            }
        }
        break; 
    case 3:
        {
            int nFieldsParsed = ::sscanf( pszASCIIEncodedRawBuffer, "%2x%2x%2x", 
                &nBytes[ 0 ], 
                &nBytes[ 1 ],
                &nBytes[ 2 ] );
            if( nFieldsParsed == 3 )
            {
                *pszOutputBegin++ = ( unsigned char ) nBytes[ 0 ];
                *pszOutputBegin++ = ( unsigned char ) nBytes[ 1 ];
                *pszOutputBegin++ = ( unsigned char ) nBytes[ 2 ];
            }        
            else
            {
                throw std::runtime_error( "Failed with conversion at position..." );
            }
        }
        break;
    case 0:
    default:
        break; 
    }
}