获取十六进制格式的浮点数
Get float in HEX format
我有字符串 char str [8]
。它显示一个十六进制格式的数字。它是浮动的并带有一个标志。如何将其写入 float 类型的变量?
例如:
char str[9] = "41700000[=10=]";
我需要从中获取 val:15.0
这是一种将 15 从十六进制 4 字节表示形式还原的快速而肮脏的方法。但是,它有太多的错误,甚至无法开始谈论它,正确的做法是问问自己 "why do i need this to begin from, and how can i do something better instead".
float hexStrToFloat(const char* str)
{
union { unsigned int i; float f; } tmp;
sscanf_s(str, "%x", &tmp.i);
return(tmp.f);
}
脚注:假定机器为 32 位或更高版本的小端字节序。
你可以双关数据:
- 使用 memcpy
unsigned int u = 0x41700000;
float f;
memcpy(&f, &u, sizeof(f));
printf("%f\n", f);
- 使用union(IMO合法,很多人持相反意见)
union un
{
float f;
unsigned u;
};
void foo(unsigned x)
{
union un a = {.u = x};
printf("%f\n", a.f);
}
我假设浮点数 && 整数具有相同的大小。
当然,您必须将问题中的字符串转换为无符号值 - 但它相对容易(scanf、atoi ....)
PS 顺便说一句,许多编译器会为两者生成完全相同的代码(没有 memcpy
调用)https://godbolt.org/z/VaCcxS
我有字符串 char str [8]
。它显示一个十六进制格式的数字。它是浮动的并带有一个标志。如何将其写入 float 类型的变量?
例如:
char str[9] = "41700000[=10=]";
我需要从中获取 val:15.0
这是一种将 15 从十六进制 4 字节表示形式还原的快速而肮脏的方法。但是,它有太多的错误,甚至无法开始谈论它,正确的做法是问问自己 "why do i need this to begin from, and how can i do something better instead".
float hexStrToFloat(const char* str)
{
union { unsigned int i; float f; } tmp;
sscanf_s(str, "%x", &tmp.i);
return(tmp.f);
}
脚注:假定机器为 32 位或更高版本的小端字节序。
你可以双关数据:
- 使用 memcpy
unsigned int u = 0x41700000;
float f;
memcpy(&f, &u, sizeof(f));
printf("%f\n", f);
- 使用union(IMO合法,很多人持相反意见)
union un
{
float f;
unsigned u;
};
void foo(unsigned x)
{
union un a = {.u = x};
printf("%f\n", a.f);
}
我假设浮点数 && 整数具有相同的大小。
当然,您必须将问题中的字符串转换为无符号值 - 但它相对容易(scanf、atoi ....)
PS 顺便说一句,许多编译器会为两者生成完全相同的代码(没有 memcpy
调用)https://godbolt.org/z/VaCcxS