請教如何將大位元(Big Endian)的浮點數,轉換到小位元(Little Endian)的浮點數 |
尚未結案
|
yjalex
一般會員 ![]() ![]() 發表:3 回覆:8 積分:2 註冊:2002-11-04 發送簡訊給我 |
小弟找過相關文章,但沒有找到可以解決小弟的問題,因此請教各位大大 起因:
小弟目前工作是將在solaris 作業系統產生的影像檔,轉換成在windows上的影像檔。遇到問題 浮點數型態(Float)的轉換 小弟先建之自定型態:
struct mhdr
{
char magic_mumber[14];
char original_file_name[32];
unsigned char sw_version[2];
unsigned char system_type[2];
unsigned char file_type[2];
char serial_number[10];
int scan_start_time;
char isotope_name[8];
unsigned char isotope_halflife[4];
........
};
mhdr hdr;
接著再以fopen來讀檔
if(OpenDialog1->Execute())
{
AnsiString filename=OpenDialog1->FileName;
int in;
FILE *ptr;
ptr=fopen(filename.c_str(),"r");
fread(&hdr,sizeof(hdr),1,ptr);
fclose(ptr);
} 問題,
float UnixFloatToIntelFloat(unsigned char *b)
{
float *f;
float ff;
char c[4]; c[0]=b[2]; c[1]=b[3]; c[2]=b[1];c[3]=b[0];//這是我亂排列組合後,還未修改的順序
f=(float*) c;
return (ff);
}
則不管如何將b的byte如何排列組何,都無法算出正確的值 小弟知道大位元的順序如是是 1234,則小位元則應該 4321
例如
01 02 03 04
要變成
04 03 02 01 但,無論如何排列,都無法表現出正確的值(在原電腦看到的數字)
用手算的值跟正確的值是一樣的 請問大大,這是BCB的問題或小弟那裡有疏忽之處 謝謝回答
|
yjalex
一般會員 ![]() ![]() 發表:3 回覆:8 積分:2 註冊:2002-11-04 發送簡訊給我 |
|
Albertz
初階會員 ![]() ![]() 發表:2 回覆:57 積分:31 註冊:2002-09-05 發送簡訊給我 |
#pragma pack(push)
#pragma pack(1) struct mhdr
{
char magic_mumber[14];
char original_file_name[32];
unsigned char sw_version[2];
unsigned char system_type[2];
unsigned char file_type[2];
char serial_number[10];
int scan_start_time;
char isotope_name[8];
unsigned char isotope_halflife[4];
........
}; #pragma pack(pop) 另外, UnixFloatToIntelFloat 可以使用 "bswap" 指令加快速度.
float UnixFloatToIntelFloat(unsigned int *b)
{
float result; result = *(float*)b;
asm{ mov eax, result;
bswap eax;
mov result, eax
}
return (result);
}
|
yjalex
一般會員 ![]() ![]() 發表:3 回覆:8 積分:2 註冊:2002-11-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |