2012-01-24 9 views
1

私のアンドロイドクライアントからhessianを使用してPHPサーバーにdouble値を送信したいが、クライアントのwriteDouble関数またはサーバーのparseDouble関数にエラーがある。hessianでアンドロイドからPHPにdoubleを送信するときに解析エラーが発生する

アンドロイドクライアントから送られてきた:

がで受信14,30485725402832

double値は、例えば、緯度と経度である(我々は:)、正しくのみダブルたちを与える問題が発生し、多くの異なるデータタイプを送信します)サーバ:1.0474191691834E-321

アンドロイドエンコーディング:

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

あなたは何とか正しいです:)それはちょっと/ -endian問題。詳細は、問題は、PHPのhessianライブラリにはエラーがあります - > $ littleEndian変数は決して設定されていません...その理由は、それが解決のために間違って – qedejavu

+0

を解析し、 'Long.reverseBytes(bits); – qedejavu

関連する問題