最近笔者在做rtmp包时发现,其对应的包整数1转成十六进制是0x3ff000……(12个0),这方面特地搜了一下发现是双精度十六进制数,和普通的转换成十六进制不太相同(百度的几个结果都是在matlab上发现的)。于是笔者花时间调了一下相互转换的代码以便组包,不超过long类型的数字范围都可使用,供各位同仁参考。
16进制字符串转long类型输出:
long makeFloatHexToLong(unsigned char* _str)
{
short __realExNum = ((((long)_str[0]) << 0x04) | ((((long)_str[1]) >> 0x04)&0x0f))-1023;
short __arrayIndex = (__realExNum+12) / 8+(((__realExNum+12)%8)?1:0)-1;
if(__arrayIndex==1)
{
short __dMov=(8-((__realExNum + 12) % 8));
long __res=(((long)_str[1])>>__dMov)&0x0f;
printf("%d\n",(0x01<<__realExNum));
__res|=(0x01<<__realExNum);
return __res;
}
short __dMov=(8-((__realExNum + 12) % 8));
long __res=0;
if(__dMov<8)
__res |= (((long)_str[__arrayIndex])>>__dMov);
else
__res |= ((long)_str[__arrayIndex]);
for (short __i = __arrayIndex - 1; __i > 1; --__i)
__res |= ((long)_str[__i] << (8*(__arrayIndex-__i)-__dMov));
__res |=((((long)_str[1])&0x0f)<<(__realExNum-4));
__res|=(0x01<<(__realExNum));
return __res;
}
long转成16进制字符串传输:
void makeFloatHexNum2(long _DecNum,unsigned char* _str)
{
long __DecNum = _DecNum;
short __len = 0;
long __TmpBit =0;
memset(_str, 0, sizeof(_str));
while (__DecNum != 0)
{
__DecNum = __DecNum >> 1;
++__len;
}
--__len;
short __realDataLen = __len;
int __Index = 1023 + __len;
while (__Index != 0)
{
__Index = __Index >> 1;
++__len;
}
++__len;
short __exLen = 11;
unsigned char* __ptr = _str;
__DecNum = 1023+__realDataLen;
bool __BecomeRealDataBit = false;
short __resever = 8;
long __tmpData = 0;
while (__DecNum != 0||__BecomeRealDataBit==false)
{
if (__DecNum == 0 && __BecomeRealDataBit == false&&__exLen==-1)
{
__BecomeRealDataBit = true;
__DecNum = _DecNum&(~(0x01<<__realDataLen--));
if(__DecNum==0)
break;
}
if (__BecomeRealDataBit == false)
{
__TmpBit = __DecNum & (0x01 << __exLen);
if(__TmpBit!=0)
__tmpData |= (0x01 << --__resever);
else
--__resever;
__DecNum = __DecNum & (~(0x01 << __exLen--));
}
else
{
__TmpBit = __DecNum & (0x01<<__realDataLen);
if(__TmpBit!=0)
__tmpData |= (0x01 << --__resever);
else
--__resever;
__DecNum = __DecNum & (~(0x01 << __realDataLen--));
}
if (__resever == 0)
{
*__ptr = __tmpData;
++__ptr;
__tmpData = 0;
__resever = 8;
}
}
*__ptr = __tmpData;
}
测试代码:
int main(int argc, const char * argv[]) {
unsigned char str[100]={0};
cout <<endl;
makeFloatHexNum2(1030000000,str);
for(int i=0;i<8;++i)
printf("%x ",str[i]);
cout <<endl;
printf("%ld",makeFloatHexToLong(str));
return 0;
}