2009-10-01 5 views
3

Zend_Amf 사양에는 플래시에서 반환 된 Number 유형이 PHP의 부동 소수점에 매핑된다는 내용이 나와 있습니다. 벌금. 하지만 16 번이 6.1026988574311E_320으로 반환되는 이유는 무엇입니까? PHP 버전은 OS X에서 실행중인 5.2.9입니다.Zend_Amf를 사용하여 PHP가 number 16을 float (6.1026988574311E_320)으로 변환하는 이유

PHP에서 정수로 캐스팅을 시도했는데 (위의 값은 0으로 반올림 됨) int를 사용하는 Actionscript에서 - 후자는 NULL로 처리됩니다. . Flash가 AMF를 통해 정수를 반환하고 PHP가이를 처리 할 수 ​​있도록하려면 어떻게해야합니까?

+0

어떤 Zend Framework 버전을 사용하고 있습니까? –

+0

1.9. 최신 업데이트는 아무런 차이가 없었습니다. – codecowboy

답변

6

고전적인 엔디안 문제가 있습니다. 젠드 (Zend) 나 플래시가이 더블의 엔디안 니스로 잘못된 것을하고있는 것 같습니다. 다음은 double (및 hex 값)을 출력하는 프로그램입니다. 그런 다음 엔디안을 뒤집어서 다시 인쇄합니다. 인텔 (리틀 엔디안 프로세서)에

#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; 
} 

, 당신은 PPC 맥 (빅 엔디안)에 출력

40300000 00000000 16 
00000000 00003040 6.1027e-320 

당신은 아마도이 실행중인 얻을? 귀하의 도구 중 하나가 귀하의 아키텍처에서 올바른 일을하지 않는 것 같습니다. 공급 업체와 버그를 신고하십시오.

해커가 해결할 수있는 방법으로 숫자를 문자열로 변환 한 다음 다른 끝의 이중으로 변환하는 것이 좋습니다.

+0

PPC mac에서 실행 중이 었습니다. 그렇지만 Windows 시스템에서도 발생했습니다. 정확한 아키텍처에 대해 확신 할 수 없으며 더 이상 불행히도 테스트 할 수있는 두 시스템에 액세스 할 수 없습니다. 귀하의 답변 주셔서 감사합니다! 그것은 그럴듯 해 보입니다. – codecowboy

1

귀하의 상황에서 무엇이 잘못 될지 모릅니다. 그러나 코드에서 어떤 일이 일어나고 있는지 부분적으로 밝힐 수있을 것 같습니다. '

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

당신이 볼 수 있듯이 그 작은 부동 소수점 숫자의 ISN을 : 몇 가지 흥미로운 출력을 생성

 
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); 
} 

: 나는 이론을 테스트하기 위해 다음과 같은 빠른 해킹을 실행 임의의 비트 패턴. 그러나, 그것은 또한 "16"과 관련된 것으로 보이지 않습니다.

Zend_Amf 설명서에 ActionScript 숫자 유형이 PHP 부동 소수점 형식으로 반환된다고 나와 있는데, 이는 Adobe에서 문서화 한 class Number을 의미합니다 : Adobe.com Flex documentation. "숫자"가 이중으로 전달된다는 의미는 아닙니다.

정수형으로 AMF로 전송 된 값이 2^29 미만인 int가 반환되며 Zend_Amf가이를 정수로 반환한다고 가정합니다.

ActionScript에서 AMF 객체를 어떻게 전송합니까? 전송되는 바이트를 덤프하는 것이 가능합니까?