[英]How to convert floating-point to unsigned variable?
有人可以幫我有關浮點變量的字節排序嗎? 實際上,該代碼在Solaris上可以正常工作,但在Windows Xp上卻不能正常工作。 這是我的代碼的一個示例:....
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
這通常是個壞主意。 即使考慮了字節順序,浮點數的格式在不同的硬件上也不一定相同。 我將建議您在這里和那里以字符串形式運送它們。
浮點格式中存在更多的潛在多樣性和問題,而不僅僅是在編組和解組整數時要處理的字節序問題。
一種解決方法是使用printf
將浮點數格式化為文本,並使用strtof()
讀回它們(如bmargulies所示)。
只要機器共享相同的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;
然后,您需要將一個int
和一個long
(上面的代碼中的x_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,因此,如果在編譯過程中檢查該值,並在其他情況下中止該值,則應該具有可移植性。
假設兩個系統具有相同的浮點格式,則yy_rec
是float
; ntohl
的unsigned long
ntohl
; 當傳遞給ntohl
時,可能具有不正確字節序的浮點值將轉換為整數表示形式。
由於從float
到unsigned long
的轉換,您應該收到編譯器警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.