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

标签 networking linux-kernel embedded arm endianness

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

相关文章:

rust - 我如何写入 Rust 中的内存映射地址?

java - 请求路由到主机 android

python-3.x - 使用 Python 以编程方式从 Docker 容器内获取主机的 IP

c - 获取内核模块中的所有挂载点

c - 如何从Linux内核中的当前线程获取父线程名称

embedded - 寻求32位板用于嵌入式开发

java - 具有传出 UDP 流量是否允许此端口上的传入流量?

networking - 使用 Motes 在 WSN 上广播

linux-kernel - 无法加载自编译的linux内核

c++ - 结构数组的嵌入式 C++ 静态初始化