我要做的是将double转换为十六进制字符串然后再转换为double.
以下代码执行转换为双十六进制字符串.
char * double2HexString(double a)
{
char *buf = new char[17]; // double is 8-byte long, so we have 2*8 + terminating \0
char *d2c;
d2c = (char *) &a;
char *n = buf;
int i;
for(i = 0; i < 8; i++)
{
sprintf(n, "%02X", *d2c++);
n += 2;
}
*(n) = '\0';
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作,但是,我不知道如何将结果字符串转换回double.请指教 :)
我很惊讶地看到没有人提出标准解决方案,这是%aISO C99标准中的格式说明符.
#include <iostream>
#include <string>
#include <stdio.h>
std::string double2hexastr(double d) {
char buffer[25] = { 0 };
::snprintf(buffer, 25, "%A", d); // TODO Check for errors
return buffer;
}
double hexastr2double(const std::string& s) {
double d = 0.0;
::sscanf(s.c_str(), "%lA", &d); // TODO Check for errors
return d;
}
int main() {
std::cout << "0.1 in hexadecimal: " << double2hexastr(0.1) << std::endl;
std::cout << "Reading back 0X1.999999999999AP-4, it is ";
std::cout << hexastr2double("0X1.999999999999AP-4") << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
老实说,使用 sprintf 很慢,但您可以使用 sscanf 恢复它,做几乎完全相同的事情。
好吧,实际上,您必须将每两个字符复制到缓冲区字符串中,才能单独解码每个字符。我的第一次尝试,以下是不正确的:
double hexString2Double(char *buf)
{
char *buf2 = new char[3];
double a;
char* c2d;
c2d = (char *) &a;
int i;
buf2[2] = '\0'
for(i = 0; i < 16; i++)
{
buf2[0] = *buf++;
buf2[1] = *buf++;
sscanf(buf2, "%X", c2d++);
}
return a;
}
Run Code Online (Sandbox Code Playgroud)
您会看到,%X 被解码为 int,而不是字节。它甚至可能有效,具体取决于低端/高端问题,但它基本上已经损坏了。那么,让我们尝试解决这个问题:
double hexString2Double(char *buf)
{
char *buf2 = new char[3];
double a;
char* c2d;
c2d = (char *) &a;
int i;
int decoder;
buf2[2] = '\0'
for(i = 0; i < 16; i++)
{
buf2[0] = *buf++;
buf2[1] = *buf++;
sscanf(buf2, "%X", &decoder);
c2d++ = (char) decoder;
}
return a;
}
Run Code Online (Sandbox Code Playgroud)
除非出现语法错误等,我认为这应该可行。
| 归档时间: |
|
| 查看次数: |
23763 次 |
| 最近记录: |