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 Type
Type 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
Dim uf As uFlt
Dim ul As uLng
uf.f = s
LSet ul = uf
Float2Hex= Hex(ul.l)
End Function
Function 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, "0" & uf.f, uf.f)
End If
End Function
Sub test()
Msgbox Hex2Float("40200000")
End sub
//Compare with C language.
#ifndef COUNTOF
#define COUNTOF(__a) ((sizeof(__a))/(sizeof(*(__a))))
#endif
static 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) );
}
}
}
}