首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在主机和网络之间转换双精度字节顺序?

如何在主机和网络之间转换双精度字节顺序?
EN

Stack Overflow用户
提问于 2012-05-16 18:42:32
回答 2查看 12.1K关注 0票数 3

谁能告诉我如何将双精度转换为网络字节排序。我试过了

代码语言:javascript
复制
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处理器架构。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-17 04:31:30

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

但关键应该是定义一个网络顺序,例如。1.字节指数和符号,字节2到n作为msb顺序的尾数。

然后,您可以声明您的函数

代码语言:javascript
复制
uint64_t htond(double hostdouble);
double ntohd(uint64_t netdouble);

实现只依赖于你的编译器/平台。

最好是使用一些自然的定义,这样你就可以在ARM平台上使用简单的转换。

编辑:

来自评论

代码语言:javascript
复制
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时。

顺便说一句。返回值的方式有点奇怪。

但是你可以写一个更稳定的版本,就像这样(伪代码)

代码语言:javascript
复制
void htond (const double hostDouble, uint8_t result[8])
{
  result[0] = signOf(hostDouble);
  result[1] = exponentOf(hostDouble);
  result[2..7] = mantissaOf(hostDouble);
}
票数 4
EN

Stack Overflow用户

发布于 2014-01-31 04:23:03

这可能有点麻烦( char* hack),但它对我很有效:

代码语言:javascript
复制
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;

}

为简洁起见,我没有包括射程守卫。不过,当你在这个级别工作时,你应该包括远程守卫。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10616883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档