记录一下有关16进制的类型转换(四字节),下次也许就不会这么头大了/(ㄒoㄒ)/~~,下面是各个转换的关键代码:
以下转换包含的头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
1、float➡16进制
//共用体
union HEX {
float num;
unsigned char hex_num[4];
};
//类型转换(float->16)
void conversion(float float_data, char *hex_p)
{
union HEX float_num;
float_num.num = float_data;
memset(hex_p, '\0', sizeof(hex_p));
char *ptr = hex_p;
for(int i = 0; i < 4; i++)
{
//大端模式顺着来0-4,小端模式逆着来4-0
snprintf(ptr, sizeof(char)*4, "%02X", float_num.hex_num[4-i-1]);
ptr += 2;
}
}
void Result()
{
float data; //待转换的float数
char result_buf[32] = {0}; //存储16进制数
//float类型转换为十六进制数
conversion(data, result_buf);
}
例如:
float data = 250.5;
char result_buf[32] = {4,3,7,A,8,0,0,0} ;
然后可以通过字符串拼接得到一个十六进制数,以下同理。
验证网址:https://www.asciim.cn/hex/float.html
2、uint➡16进制
//类型转换(uint->16)
void conversion(uint uint_data, char *hex_p)
{
//大端模式
hex_p += 7;
for(int i = 7; i >= 0; i--)
{
int mod = uint_data % 16;
if (mod < 10)
{
*hex_p = mod + '0';
}
else
{
*hex_p = mod - 10 + 'A';
}
uint_data = uint_data / 16;
if(i > 0)
{
hex_p--;
}
}
}
void Result()
{
uint data; //待转换的uint数
char result_buf[32] = {0}; //存储16进制数
//uint类型转换为十六进制数
conversion(data, result_buf);
}
3、16进制➡float/uint
由于我是在qt实现的,它有专门的.toUInt类型转换,其他的还没有尝试过,这里思路是先转uint,再转float。
//类型转换(16->float)
float reconversion(QString hex_data)
{
uint hex_uint = hex_data.toUInt(nullptr, 16);
float hex_float = *(float*)&hex_uint;
return hex_float;
}