2009-10-01 63 views
3

Zend_Amf規範指出從Flash返回的Number類型將映射到PHP中的float。精細。但爲什麼16號返回6.1026988574311E_320?在OS X上運行的PHP版本是5.2.9。爲什麼PHP使用Zend_Amf將數字16轉換爲float(6.1026988574311E_320)

我試圖在PHP中強制轉換爲整數(上面的值被四捨五入爲0),並且還使用int(16)從Actionscript - 後者通過NULL 。如何確保Flash通過AMF返回一個整數,並且PHP可以處理它?

+0

您使用的是什麼版本的Zend Framework? – 2009-10-12 16:06:49

+0

1.9。更新到最新沒有區別 – codecowboy 2009-10-12 20:42:30

回答

6

你有一個典型的endian問題。看起來像是Zend或者flash在做這個double的endianness時做錯了事情。這是一個打印double(及其十六進制值)的程序。然後它反轉字節順序並再次打印。

#include <stdio.h> 
#include <stdint.h> 

int main(void) 
{ 
    double d = 16; 
    uint32_t *i = (uint32_t *)(&d); 
    uint8_t *c = (uint8_t *)(&d); 
    size_t j; 

    printf("%08x %08x %lg\n", i[1], i[0], d); 

    for(j = 0; j < sizeof(double)/2; j++) 
    { 
     uint8_t tmp; 

     tmp = c[j]; 
     c[j] = c[sizeof(double) - j - 1]; 
     c[sizeof(double) - j - 1] = tmp; 
    } 

    printf("%08x %08x %lg\n", i[1], i[0], d); 

    return 0; 
} 

在Intel(小端處理器),你得到這個輸出

40300000 00000000 16 
00000000 00003040 6.1027e-320 

你或許運行這個PPC的Mac(大端)上?看起來像你的工具之一在你的架構上沒有做正確的事情。向供應商提出錯誤。

作爲一種詭異的解決方法,我建議將您的號碼轉換爲字符串,然後將其轉換回另一端的雙精度。

+0

它運行在PPC mac上,是的,但它也發生在Windows機器上。我不確定確切的架構,並且不再有權訪問任何一臺機器以進行測試。謝謝你的回答!這聽起來似乎合理。 – codecowboy 2009-10-14 12:19:17

1

我不完全知道您的情況出了什麼問題,但我想我可能會部分說明您的代碼正在發生什麼。我跑了以下快速黑客來測試一個理論:

 
void hexdump_double(double dbl) 
{ 
    assert(8 == sizeof(dbl)); 
    printf("double: %02X %02X %02X %02X %02X %02X %02X %02X (%lg)\n", 
      ((char *)&(dbl))[0], 
      ((char *)&(dbl))[1], 
      ((char *)&(dbl))[2], 
      ((char *)&(dbl))[3], 
      ((char *)&(dbl))[4], 
      ((char *)&(dbl))[5], 
      ((char *)&(dbl))[6], 
      ((char *)&(dbl))[7], 
      dbl); 
} 

int main() 
{ 
    hexdump_double(6.1026988574311E-320); 
} 

這會產生一些令人振奮的輸出:

double: 40 30 00 00 00 00 00 00 (6.1027e-320)

正如你所看到的,這小浮點數ISN」 t任何隨機模式的位。但是,它也不會與「16」相關。

其中,Zend_Amf文檔指出ActionScript數字類型作爲PHP浮動返回,意思是class Number由Adobe記錄:Adobe.com Flex documentation。這並不意味着任何「數字」將作爲雙重數字傳遞。

值小於2^29的int將作爲整數類型在AMF中返回傳輸,我假設Zend_Amf將以整數形式返回它。

如何從ActionScript中傳輸AMF對象?轉儲正在發送的字節是否可行?