0

誰かが浮動小数点変数に関するバイト順序付けを手伝ってくれませんか?実際、コードはSolarisでは正しく機能していますが、WindowsXPでは機能していません。これが私のコードの一部の例です:...。

 int x_snd=1;
 float y_snd=1.13;
 struct {
      int xx_snd;
      float yy_snd;
    } data_snd;
 int x_rec;
 float y_rec;
    struct {
      int xx_rec;
      float yy_rec;
    } data_rec;  

 //marshalling 
 data_snd.xx_snd=htons(x_snd);
 data_snd.yy_snd=htonl(*(int*) &y_snd);

 //write data to socket
 send(sock1, &data_snd, ...

 //clean ...

 //read data from socket
 if recv(sock, &data_rec ...

  //unmarshalling
  x_rec=ntohs(data_rec.xx_rec);
  y_rec= *(float*) &(ntohl(data_rec.yy_rec));

..。

このコードは、Unixではgccを使用し、wndowsではMSVC++6を使用してコンパイルされました。皆様のご協力をよろしくお願いいたします。エンディアンに関する有用な情報を提供するリンクやドキュメントをご案内いただければ幸いです...

よろしくお願いします、mk

4

3 に答える 3

2

これは一般的に悪い考えです。浮動小数点数の形式は、バイトオーダーを考慮した後でも、異なるハードウェアで必ずしも同じであるとは限りません。ひもとしてあちこちに発送することをお勧めします。

于 2009-11-11T23:44:56.983 に答える
2

浮動小数点形式には、整数をマーシャリングおよびアンマーシャリングするときに対処しなければならないエンディアンの問題よりも、はるかに多くの潜在的な多様性と問題があります。

1つの方法は、浮動小数点数をテキストとしてフォーマットし、を使用して、 (bmarguliesが示すように)printfそれらを読み戻すことです。strtof()

マシンが同じ値を共有している限り機能する別の方法は、マシンをFLT_RADIX仮数と指数の値に分割することです。

#include <math.h>
#include <limits.h>

float x = 1.13;
int x_exp;
long x_mant;

x_exp = ilogbf(x);
x_mant = (scalbnf(fabsf(x), -x_exp) - 1) * LONG_MAX;
if (x < 0.0)
    x_mant = -x_mant;

次に、intlongx_expおよびx_mant上記のコードから)をワイヤーに配置します。これは、通常の関数ntohl()htonl()関数を使用して実行できます。これらをに戻すにはfloat、次を使用します。

x = scalbnf((fabsf(x_mant) / LONG_MAX) + 1, x_exp);
if (x_mant < 0)
    x = -x;

ほとんどのマシンのFLT_RADIX値(で定義float.h)は2であることに注意してください。したがって、コンパイル中にその値を確認し、それが別のものである場合は中止する場合は、適度に移植可能である必要があります。

于 2009-11-12T00:26:21.147 に答える
1

両方のシステムが同じ浮動小数点形式であると仮定すると、yy_recfloat;です。;ntohlを取る unsigned longエンディアンが正しくない可能性のある浮動小数点値は、に渡されるときに整数表現に変換されntohlます。

floatからへの変換により、コンパイラの警告が表示されるはずですunsigned long

于 2009-11-11T23:46:55.363 に答える