谁能告诉我如何将 double 转换为网络字节顺序。 我试过了
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
功能,它们运行良好,但它们都没有进行双(浮点)转换,因为这些类型在每个体系结构上都不同。通过 XDR,我发现了双浮点精度格式表示 (http://en.wikipedia.org/wiki/Double_precision),但那里没有字节顺序。
所以,如果有人能帮助我解决这个问题,我将不胜感激(C 代码会很棒!)。 注:操作系统为Linux内核(2.6.29),ARMv7 CPU架构。
最佳答案
你可以看看IEEE 754在 float 的交换格式。
但关键应该是定义一个网络顺序,例如。 1. 字节指数和符号,字节 2 到 n 作为尾数,以 msb 顺序排列。
然后你就可以声明你的函数了
uint64_t htond(double hostdouble);
double ntohd(uint64_t netdouble);
实现仅取决于您的编译器/平台。
最好的办法是使用一些自然的定义,
所以你可以在 ARM 平台上使用简单的转换。
编辑:
来自评论
static void htond (double &x)
{
int *Double_Overlay;
int Holding_Buffer;
Double_Overlay = (int *) &x;
Holding_Buffer = Double_Overlay [0];
Double_Overlay [0] = htonl (Double_Overlay [1]);
Double_Overlay [1] = htonl (Holding_Buffer);
}
这可行,但显然前提是两个平台对 double 使用相同的编码模式,并且 int 具有相同的 long 大小。
顺便提一句。返回值的方式有点奇怪。
但是你可以写一个更稳定的版本,像这样(伪代码)
void htond (const double hostDouble, uint8_t result[8])
{
result[0] = signOf(hostDouble);
result[1] = exponentOf(hostDouble);
result[2..7] = mantissaOf(hostDouble);
}
关于networking - 如何在主机和网络字节顺序之间转换 double?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10616883/