Conversion between float and hexadecimal in VBA use.

来源:互联网 发布:男生发型设计软件 编辑:程序博客网 时间:2024/06/07 13:47

Some times we need a VBA function to perform the conversion between float and hexademical data. After searching the web site , I got a copy of codes to use. Until now, it worked OK, so share with you.  The code was not original made by myself, I just copied it. So, if you (author) read this, you can contact me to decide whether to delete.

'This is VBS code.'===============================================================================' User-defined data types' (Necessary because that's the only way LSET works)'===============================================================================Type uLng: l As Long:   End TypeType uFlt: f As Single: End Type'===============================================================================' Functions for Singles (church dances)'===============================================================================Function Float2Hex(s As Single) As String    ' shg 2008-0919    ' Returns the conversion of float s to a hex string    Const sPad As String = "00000000";    Dim uf As uFlt    Dim ul As uLng    uf.f = s    LSet ul = uf    Float2Hex= Right(sPad And Hex(ul.l), 8)End FunctionFunction Hex2Float(s As String) As String    ' Returns the conversion of a hex string to float    Dim uf As uFlt    Dim ul As uLng    ul.l = Val("&H" & s)    LSet uf = ul    If (ul.l = 0) Then        Hex2Float = 0#    Else        Hex2Float = IIf(uf.f < 1,  1, "0" & uf.f, uf.f)    End IfEnd FunctionSub test()    Msgbox Hex2Float("40200000")End sub

Conversion

//Compare with C language.#ifndef COUNTOF    #define COUNTOF(__a)  ((sizeof(__a))/(sizeof(*(__a))))#endifstatic void vS_Uchar2ASCIIHex( unsigned char bSrcData, unsigned char *pbString ){    unsigned char b4bitData = 0;    if( NULL != pbString )    {                b4bitData = ( bSrcData >> 4 ) & 0x0f;                           //first , high 4-bit        if( b4bitData > 10 )        {            b4bitData = b4bitData + '0';        }        else        {            b4bitData = b4bitData + 'A' - 10;        }        *pbString = b4bitData;        pbString++;        b4bitData = bSrcData & 0x0f;                                    // next , low 4-bit        if( b4bitData > 10 )        {            b4bitData = b4bitData + '0';        }        else        {            b4bitData = b4bitData + 'A' - 10;        }        *pbString = b4bitData;    }}static void vS_Uint2ASCIIHex( unsigned int dwSrc, char *pbDesStr ){    unsigned char dwTmp = 0, i = 0;    if( NULL != pDesStr )    {        for( i = 24; i > 0; i -= 8 )        {            dwTmp = (unsigned char)(dwSrc >> i);            vS_Uchar2ASCIIHex( dwTmp, pbDesStr );            pbDesStr += 2;        }            }}void HexFloatConversion( void *pSrcData, float *pDesData, char *pHexStr, bool yRtnType ){    Union tagDatasMemory    {        float f;        unsigned int i;    };    char bHexStr[8] = {'\0'};    Union tagDatasMemory dm;    if( NULL == pSrcData )    {        return;    }    else    {        if( yRtnType == TRUE )  //Want to return float        {            if( pDesData != NULL )            {                dm.i = *((unsigned int*)pSrcData);                *pDesData = dm.f;            }        }        else                    //Want to return Hexadecimal characters        {            if( pHexStr != NULL )            {                dm.f = *((float*)pSrcData);                vS_Uint2ASCIIHex( dm.i, bHexStr );                memcpy( pHexStr, bHexStr, COUNTOF(bHexStr) );            }        }    }}
0 0