将Double转换为十六进制字符串
Convert Double to Hex String?
在我的项目中,我读取一个双变量作为十六进制并将其加载到字符串中。
我需要将十六进制字符串转换为双精度数。我现在使用这个:
double hexstr2double(const std::string& hexstr)
{
union
{
long long i;
double d;
} value;
value.i = std::stoll(hexstr, nullptr, 16);
return value.d;
}
当我这样做时:
qDebug() << hexstr2double("402540798D23092A");
输出为10.6259。不是很准确,但我觉得很好。
然后用户可以将该数字编辑为他们想要的任何数字。我如何将它们的数字转换回十六进制表示?
感谢您的宝贵时间。
虽然sstream是一个很好的答案…这里有一些关于在多线程程序中使用流的问题。
与snprintf:
类似的解决方案#include <iostream>
#include <cstdio>
double hexstr2double(const std::string& hexstr)
{
union
{
long long i;
double d;
} value;
value.i = std::stoll(hexstr, nullptr, 16);
return value.d;
}
std::string double2hexstr(double x) {
union
{
long long i;
double d;
} value;
value.d = x;
char buf[17];
snprintf (buf,sizeof(buf),"%016llx",value.i);
buf[16]=0; //make sure it is null terminated.
return std::string(buf);
}
int main(int argc,char **argv) {
double a=3.141592;
std::string x=double2hexstr(a);
double b=hexstr2double(x);
std::cout << a << std::endl;
std::cout << x << std::endl;
std::cout << b << std::endl;
return 0;
}
编辑(使用std::ostringstream的替代版本)
#include <iostream>
#include <sstream>
#include <iomanip>
double hexstr2double(const std::string& hexstr)
{
union
{
long long i;
double d;
} value;
value.i = std::stoll(hexstr, nullptr, 16);
return value.d;
}
std::string double2hexstr(double x) {
union
{
long long i;
double d;
} value;
value.d = x;
std::ostringstream buf;
buf << std::hex << std::setfill('0') << std::setw(16) << value.i;
return buf.str();
}
int main(int argc,char **argv) {
double a=3.141592;
std::string x=double2hexstr(a);
double b=hexstr2double(x);
std::cout << a << std::endl;
std::cout << x << std::endl;
std::cout << b << std::endl;
return 0;
}
注意……我并不是说std::ostringstream不起作用。它在内存安全方面当然有更好的属性(就像snprintf比sprintf有更好的属性一样)…但是要注意,在多线程程序中(至少在某些STL实现中)可能会导致过度锁定。
当您像这样使用union
时,请注意不可移植(不符合c++标准)
有一个很好的讨论:CppCon 2019: Timur Doumler"现代c++中的类型双关语"
一个符合的解决方案可以是:
#include <iostream>
#include <cstdio>
#include <cstdint>
#include <cstring>
double hexstr2double(const std::string& hexstr) {
uint64_t i = std::stoll(hexstr, nullptr, 16);
double d;
std::memcpy(&d,&i,8);
return d;
}
std::string double2hexstr(double x) {
uint64_t i;
std::memcpy(&i,&x,8);
char buf[17];
snprintf (buf,sizeof(buf),"%016llx",i);
buf[16]=0; //make sure it is null terminated.
return std::string(buf);
}
int main(int argc,char **argv) {
double a=3.141592;
std::string x=double2hexstr(a);
double b=hexstr2double(x);
std::cout << a << std::endl;
std::cout << x << std::endl;
std::cout << b << std::endl;
return 0;
}
相关文章:
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何在C++中将十六进制字符串转换为文本数据
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 将字符串(可以是十进制字符串或十六进制字符串)转换为整数C++
- 将 std::string( "x3BxDEx7C" ) 转换为可读的十六进制字符串?
- C++ 将十六进制字符串表示形式转换为十六进制字符串表示形式
- 字符数组到十六进制字符串的转换 - 意外输出
- C++十进制到十六进制(字符串下标超出范围)
- C++十六进制字符串转换为十六进制的字符 *
- 如何在C++中将十六进制字符串转换为字节字符串?
- 从十六进制字符串转换为十六进制字符数组
- 以C++格式将十六进制字符串转换为十进制数
- 将无符号字符 * 转换为十六进制字符串
- 在C++中将 HWND 转换为十六进制字符串
- 按位函数 AND、OR 和 XOR 在 C++ 中使用十六进制字符串
- 如何将十六进制字符串转换为 HTML 实体
- 查找十六进制字符串是 utf-8 或 utf-16
- 在 c++ 中使用字符串流将 4 个字符的十六进制字符串转换为有符号的短字符串
- 将 std::十六进制字符串转换为 std::array<T, 6>