Neden sayı 16 PHP Zend_Amf kullanılarak yüzer (6.1026988574311E_320) dönüştürülür

2 Cevap php

Zend_Amf şartname flaş döndü Bir Numara türü PHP bir float eşleştirmek belirtiyor. Güzel. Ama neden sayı 16 6.1026988574311E_320 olarak iade olsun demek? PHP version 5.2.9 OS X üzerinde çalışan

Ben int (16) kullanarak Actionscript da bir PHP tamsayı döküm (yukarıdaki değeri 0'a yuvarlanır alır) ve zorlama denedim - ikincisi olarak NULL yoluyla geliyor. Nasıl Flash AMF aracılığıyla ve PHP onunla başa çıkabilirim bir tamsayı döndürür emin olabilirim?

2 Cevap

Eğer klasik bir endian sorun var. Zend veya flash ya bu ikizi endian ile yanlış bir şey yapıyor gibi görünüyor. Burada çift (ve onaltılık değerini) yazdıran bir programdır. Daha sonra endianness'ın tersine ve tekrar yazdırır.

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

Bir Intel (little endian işlemci), sen bu çıktıyı almak

40300000 00000000 16
00000000 00003040 6.1027e-320

Belki bir PPC Mac (big endian) Bu çalıştırıyor musunuz? Lütfen araçlardan biri sizin mimarisi üzerine doğru şeyi yapmıyor gibi görünüyor. Satıcıları ile bir hata dosyası.

Bir hacky Çözüm olarak, ben bir dize içine numara dönüm öneririz ve sonra diğer ucunda geri çift dönüştürerek.

Senin durumun yanlış gidiyor tamamen bilmiyorum, ama ben kısmen kodunuzu neler olduğunu aydınlatmak mümkün olabilir düşünüyorum. Bir teoriyi test etmek için aşağıdaki hızlı kesmek koştu:

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

Hangi bazı heyecan verici bir çıktı üretir:

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

Gördüğünüz gibi, o küçük kayan noktalı sayı bit rastgele bir model değildir. Ancak, aynı zamanda ilişkili olduğu görünmüyor "16".

Zend_Amf belgeleri ActionScript Numarası türü bir PHP float olarak döndürülür bildiren Nerede, ne demek olduğunu class Number Adobe tarafından belgelenmiştir: Adobe.com Flex documentation. Bu herhangi bir "sayı" bir çift olarak kabul edileceği anlamına gelmez.

2 ^ 29 daha az değere sahip bir int döndürülen bir tamsayı türü olarak AMF'deki aktarılacak, ve ben Zend_Amf bir tamsayı olarak bu dönecektir varsayalım.

Nasıl ActionScript'ten AMF nesneyi iletiliyor? Bu bayt gönderilen dökümü için uygulanabilir mi?