3

有人可以告诉我如何将双精度转换为网络字节排序。我试过了

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 架构。

4

2 回答 2

4

您可以查看IEEE 754中的浮点交换格式。

但关键应该是定义网络顺序,例如。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);
}
于 2012-05-16T20:31:30.280 回答
1

这可能是 hacky(char* hack),但它适用于我:

double Buffer::get8AsDouble(){

    double little_endian = *(double*)this->cursor;

    double big_endian;

    int x = 0;
    char *little_pointer = (char*)&little_endian;
    char *big_pointer = (char*)&big_endian;

    while( x < 8 ){
        big_pointer[x] = little_pointer[7 - x];
        ++x;
    }

    return big_endian;

}

为简洁起见,我没有包括范围守卫。不过,在此级别工作时,您应该包括范围守卫。

于 2014-01-30T20:23:03.070 回答