谁能告诉我如何将双精度转换为网络字节排序。我试过了
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处理器架构。
发布于 2012-05-17 04:31:30
您可以查看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);
}发布于 2014-01-31 04:23:03
这可能有点麻烦( 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;
}为简洁起见,我没有包括射程守卫。不过,当你在这个级别工作时,你应该包括远程守卫。
https://stackoverflow.com/questions/10616883
复制相似问题