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