Java 使用hessian从android向php发送double时出现解析错误

Java 使用hessian从android向php发送double时出现解析错误,java,php,hessian,Java,Php,Hessian,我想使用hessian从android客户端向PHP服务器发送一个双精度值,但客户端上的writeDouble函数或服务器上的parseDouble函数都有错误。(我们可以正确地传输多种不同的数据类型,只有双数据类型会给我们带来麻烦:)) 双值是经度和纬度,例如: 从android客户端发送:1430485725402832 在服务器上收到:1.0474191691834E-321 android编码: public void writeDouble(double value) throws I

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

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

从android客户端发送:1430485725402832

在服务器上收到: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));
}
(void)encodeDouble:(double)realv forKey:(NSString*)key;
{
   if (key) [self writeTypedObject:key];
   [self writeChar:'D'];
   [self writeInt64:(int64_t)(*((double*)(&realv)))];
}
php解码:

function parseDouble($code, $num){
            $bytes = $this->read(8);
            if(HessianUtils::$littleEndian)
                    $bytes = strrev($bytes);
            $double = unpack("dflt", $bytes);
    return $double['flt'];
    }
顺便说一句:我们也有一个iPhone客户端发送的双重工程罚款

iphone编码:

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));
}
(void)encodeDouble:(double)realv forKey:(NSString*)key;
{
   if (key) [self writeTypedObject:key];
   [self writeChar:'D'];
   [self writeInt64:(int64_t)(*((double*)(&realv)))];
}

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

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

您能给出一个发送值和接收值的示例吗,正确运行的iPhone代码是什么样子的?我假设它是用C语言编写的,因此不是Java的完全副本……我在问题中添加了iphone代码和发送/接收双值的示例。你能给出一个发送值和接收值的示例吗?另外,正确工作的iphone代码看起来像什么?我假设它是用C语言编写的,因此不是Java的完全副本……我在问题中添加了iphone代码和发送/接收双值的示例,你说得对:)这是一个小/大端问题。具体来说,问题是php hessian库有一个错误->从未设置$littleEndian变量。。。这就是它解析错误的原因对于解决方案,只需使用
Long.reverseBytes(位)你是对的:)这是一个小/大端问题。具体来说,问题是php hessian库有一个错误->从未设置$littleEndian变量。。。这就是它解析错误的原因对于解决方案,只需使用
Long.reverseBytes(位)