Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包裹通过插座_Java_Android_C++_Sockets_Parcel - Fatal编程技术网

Java 包裹通过插座

Java 包裹通过插座,java,android,c++,sockets,parcel,Java,Android,C++,Sockets,Parcel,我正试图通过套接字将包裹发送到android应用程序。客户端在libbinder(c++)中,服务器是一个android应用程序,需要重建包裹。我寻找解决方案已经有一段时间了,但我不知道如何序列化包裹,然后在服务器端重新构建它。关于如何做到这一点有什么想法吗 谢谢 我处理数据的代码部分 客户 Parcel parc = Parcel(); double three = 5.5; parc.writeDouble(three); unsigned char b[sizeof(parc)]; st

我正试图通过套接字将包裹发送到android应用程序。客户端在libbinder(c++)中,服务器是一个android应用程序,需要重建包裹。我寻找解决方案已经有一段时间了,但我不知道如何序列化包裹,然后在服务器端重新构建它。关于如何做到这一点有什么想法吗

谢谢

我处理数据的代码部分

客户

Parcel parc = Parcel();
double three = 5.5;
parc.writeDouble(three);

unsigned char b[sizeof(parc)];
std::memcpy(b, &parc, sizeof(parc));
那我就这样送

send(client, b, sizeof(b), 0);
服务器

private int count
private InputStream in = null;
try {
    in = socket.getInputStream();
} catch (IOException e) {
    e.printStackTrace();
}
try {
    count = in.read(bytes);
}catch (IOException e) {
    e.printStackTrace();
}

Parcel parcel = Parcel.obtain();
parcel.unmarshall(bytes, 0, bytes.length);
parcel.setDataPosition(0);

double d = parcel.readDouble();

Log.v("----double---", "double" + d);

我们可以找到一个很好的例子


通常,您需要确保有可用于重建(从地块创建)对象的类。

可以找到一个很好的示例


一般来说,您需要确保有可用于重建(从地块创建)对象的类。

。。。从这个例子中我了解到,我可以使用unmarshall函数从字节数组重新构建一个包。关于如何在客户端libbinder(c++)上序列化包,有什么想法吗?最简单的方法是查看。基本上,它只是一个序列化的字节流。查看方法
writeValue()
。您可以看到,对于每个项,它都会编写代码,指示该项是什么,后跟该项的序列化“是”。创建一个简单的程序,将一组不同的已知类型打包,然后转储字节流。您应该能够找到答案。
Parcel.cpp
的源代码可以在这里找到:如果您使用的是libbinder,那么您应该能够直接使用
Parcel
类。我创建了一个程序,可以打包物品,然后通过套接字发送包裹。我曾经使用memcpy将它放在字节数组上(我认为问题可能在这里),然后发送字节数组,但结果是一样的。在服务器端,我通过inputstream从套接字接收数据并读取到字节数组。然后,我使用unmarshal函数创建地块。当我读取项目时,值不正确。这是否意味着我无法将包裹传递到套接字上,还是因为c++/java之间的兼容性问题?很抱歉打扰你,但我真的很抱歉你应该能做到。你能检查你得到的字节流,看看它是什么样子吗?您可能只差了几个字节,或者字节顺序(LSB/MSB)不同。张贴你用来发送和接收的代码。所以。。。从这个例子中我了解到,我可以使用unmarshall函数从字节数组重新构建一个包。关于如何在客户端libbinder(c++)上序列化包,有什么想法吗?最简单的方法是查看。基本上,它只是一个序列化的字节流。查看方法
writeValue()
。您可以看到,对于每个项,它都会编写代码,指示该项是什么,后跟该项的序列化“是”。创建一个简单的程序,将一组不同的已知类型打包,然后转储字节流。您应该能够找到答案。
Parcel.cpp
的源代码可以在这里找到:如果您使用的是libbinder,那么您应该能够直接使用
Parcel
类。我创建了一个程序,可以打包物品,然后通过套接字发送包裹。我曾经使用memcpy将它放在字节数组上(我认为问题可能在这里),然后发送字节数组,但结果是一样的。在服务器端,我通过inputstream从套接字接收数据并读取到字节数组。然后,我使用unmarshal函数创建地块。当我读取项目时,值不正确。这是否意味着我无法将包裹传递到套接字上,还是因为c++/java之间的兼容性问题?很抱歉打扰你,但我真的很抱歉你应该能做到。你能检查你得到的字节流,看看它是什么样子吗?您可能只差了几个字节,或者字节顺序(LSB/MSB)不同。张贴用于发送和接收的代码。