1

我想使用 hessian 从我的 android 客户端向 PHP 服务器发送一个 double 值,但是客户端上的 writeDouble 函数或服务器上的 parseDouble 函数有错误。(我们正确传输了许多不同的数据类型,只有双重给我们带来麻烦:))

双精度值是经度和纬度,例如:

从安卓客户端发送:14,30485725402832

在服务器收到: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)))];
}
4

1 回答 1

1

鉴于 iOS 是 little-endian,我认为您希望double在 Java 代码中以相反的顺序对您的代码进行编码。

于 2012-01-24T12:58:18.170 回答