2012-01-24 1 views
1

Я хочу отправить двойное значение от моего клиента android на сервер PHP с использованием hessian, но либо функция writeDouble на клиенте, либо функция parseDouble на сервере имеет ошибку. (Мы передаем много различных типов данных, правильно, только двойной дать нам неприятности :))ошибка синтаксического анализа при отправке double из android в php с hessian

Двойные значения долготы и широты, например:

отправлено из андроида клиента: 14,30485725402832

получил в сервер: 1.0474191691834E-321

Android кодирования:

public void writeDouble(double value) throws IOException 
{ 
    long bits = Double.doubleToLongBits(value); 

    os.write('D'); 
    os.write((byte) (bits >> 56)); 
    os.write((byte) (bits >> 48)); 
    os.write((byte) (bits >> 40)); 
    os.write((byte) (bits >> 32)); 
    os.write((byte) (bits >> 24)); 
    os.write((byte) (bits >> 16)); 
    os.write((byte) (bits >> 8)); 
    os.write((byte) (bits)); 
} 

PHP декодирование:

function parseDouble($code, $num){ 
      $bytes = $this->read(8); 
      if(HessianUtils::$littleEndian) 
        $bytes = strrev($bytes); 
      $double = unpack("dflt", $bytes); 
    return $double['flt']; 
    } 

кстати: у нас есть клиент iPhone отправить двойной - работает отлично ...

кодирования iphone:

(void)encodeDouble:(double)realv forKey:(NSString*)key; 
{ 
    if (key) [self writeTypedObject:key]; 
    [self writeChar:'D']; 
    [self writeInt64:(int64_t)(*((double*)(&realv)))]; 
} 
+0

Можете ли вы привести пример значения, которое вы отправили, и того, что оно было получено как? –

+0

Также, как выглядит правильно работающий код iPhone? Я предполагаю, что он находится в C и, следовательно, не является точным дубликатом Java ... –

+0

Я добавил код iphone и пример отправленных/полученных двойных значений на вопрос – qedejavu

ответ

1

Учитывая, что IOS мало-младшему, я думаю, что вы хотите закодируйте свой double в обратном порядке в коде Java.

+0

вы были как-то правы :) это немного/большой -диагностическая проблема. В частности, проблема в том, что библиотека php hessian имеет ошибку -> переменная $ littleEndian никогда не устанавливается ... поэтому она анализирует неправильный – qedejavu

+0

как и для решения, просто используйте 'Long.reverseBytes (bits);' – qedejavu

Смежные вопросы