双精度到十六进制字符串 & 十六进制字符串转为双精度
我想做的是将双精度数转换为十六进制字符串,然后再转换回双精度数。
以下代码将双精度字符串转换为十六进制字符串。
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';
}
这似乎可行,但是,我不确定如何将结果字符串转换回双精度。 请指教 :)
What I'm trying to do is to convert a double to hex string and then back to double.
The following code does conversion double-to-hex string.
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';
}
This seems work, however, I'm not sure how to convert the resulting string back to double.
Please advise :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
我很惊讶地发现没有人提出标准解决方案,即 ISO C99 标准中的
%a
格式说明符。I am surprised to see nobody has come up with the standard solution, which is the
%a
format specifier in the ISO C99 Standard.这使用非标准
hh
修饰符。 如果您不想使用它,请使用:This uses the non-standard
hh
modifier. If you don't want to use that, use:对于 MFC,将 double 转换为 CString :)
-345.86783907228863 -> "-159.DE2" (beforKomma=3)
For MFC, convert double to CString :)
-345.86783907228863 -> "-159.DE2" (beforKomma=3)
老实说,使用 sprintf 很慢,但您可以使用 sscanf 恢复它,做几乎完全相同的事情。
好吧,实际上,您必须将每两个字符复制到缓冲区字符串中,才能单独解码每个字符。 我的第一次尝试,下面是不正确的:
你看,%X 被解码为 int,而不是字节。 它甚至可能有效,具体取决于低端/高端问题,但它基本上已经损坏了。 因此,让我们尝试解决这个问题:
除非出现语法错误等,我认为这应该可行。
Using sprintf is slow, to be honest, but you can revert it with sscanf, doing almost exactly the same thing.
Well, actually, you'd have to copy each two characters to a buffer string, to decode each individually. My first try, below is incorrect:
You see, %X is decoded as an int, not as a byte. It might even work, depending on low-ending/high-endian issues, but it's basically broken. So, let's try to get around that:
Barring syntax errors and such, I think this should work.
应该执行几乎相同的程序
Quick & 。 肮脏的。
但请注意,这是在玩火。 首先,您的十六进制字符串只能在具有相同双精度格式和相同字节序的机器上使用。 其次,转换函数缺乏严格的别名规则。
Almost the same procedure should do
Quick & dirty.
Note, however, that this is playing with fire. First, your hex strings are only usable on machines with the same double format, and the same endianness. Second, the conversion functions are short on strict aliasing rule.
也许不是最有效的解决方案,但最容易编码。
Maybe not the most efficient solution, but the easiest to code.
你想使用联合并避免这个坏习惯:
char *d2c;
d2c = (char *) &a;
仅仅打印它还不错,当你尝试修改 d2c 然后使用 a is 时,你就会遇到麻烦。 (对于共享相同(理论上)内存的任何两个变量或指针(或数组)也是如此。
You want to use a union and avoid this bad habit:
char *d2c;
d2c = (char *) &a;
For just printing its not bad, its when you try to modify d2c and then use a is when you get into trouble. (same is true for any two variables or pointers (or arrays) sharing the same (theoretical) memory.
我正在使用下面的函数将双精度转换为十六进制。
通过1.0 & 16.0 到这个函数,观察到的返回值是 000000000000FF37 & 分别为 0000000000003040。 我认为我们应该得到 1 & 10.
I am using the below function, to convert double to hexadecimal.
passing 1.0 & 16.0 to this function, the return values observed are 000000000000FF37 & 0000000000003040 respectively. I think we should get 1 & 10.