Zend_Amf规范声明从flash返回的Number类型将映射到PHP中的float。精细。但是为什么16号作为6.1026988574311E_320返回?在OS X上运行的PHP版本为5.2.9。
我已经尝试在PHP中强制转换为整数(上面的值被舍入为0),并且还使用int(16)从Actionscript中强制转换 - 后者通过NULL来实现。如何确保Flash通过AMF返回一个整数并且PHP可以处理它?</ p>
答案 0 :(得分:6)
你有一个经典的字节序问题。看起来像Zend或flash使用这个双精度的字节顺序做错了。这是一个打印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(大端)上运行它?似乎您的一个工具在您的架构上没有做正确的事情。提交供应商的错误。
作为一个hacky解决方法,我建议将你的号码转换为字符串,然后将其转换回另一端的双倍。
答案 1 :(得分: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)
如您所见,这个小浮点数不是任何随机的位模式。但是,它看起来也与“16”无关。
在Zend_Amf文档声明ActionScript Number类型作为PHP float返回的地方,意味着Adobe记录的class Number
:Adobe.com Flex documentation。这并不意味着任何“数字”将作为双重传递。
值为小于2 ^ 29的int将作为整数类型在AMF中返回,我假设Zend_Amf将其作为整数返回。
如何从ActionScript传输AMF对象?转储正在发送的字节是否可行?