gpt4 book ai didi

networking - 如何在主机和网络字节顺序之间转换 double?

转载 作者:行者123 更新时间:2023-12-04 02:08:42 24 4
gpt4 key购买 nike

谁能告诉我如何将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com