0

我正在做一个项目,我需要通过某个 IPC 堆栈(在我的情况下为 LCM)发送,问题是我需要为 IPC 提供一个可变长度的结构。我有

struct pack1 {int value1; int value2;};
struct pack2 {void *data; int data_size;}; 
//data won't always point to pack1 types

我有一个指向 pack2 的指针,我需要像序列化这样的东西,所以我可以pack2通过网络将它发送到另一个进程。

有谁知道怎么做?

4

4 回答 4

2

LCM 支持可变长度数组,请参阅参考手册中的“数组”部分:http: //lcm.googlecode.com/svn-history/r401/www/reference/lcm/tutorial-lcm-language.html

但是,您的数据是通过 访问的void*,它只是一个指向“未知”类型的指针。如果您的数据只是字节,那么将其视为字节数组可能会起作用,就像您的 LCM 定义中这样:

struct pack2 {
  int32_t data_size;
  unsigned char data[data_size};
}
于 2011-02-07T20:14:03.483 回答
1

任何时候序列化包含指针的数据结构时,都需要将这些指针转换为指针以外的东西。一种可能性是将它们转换为数据流中的偏移量;另一种可能性是完全删除它们并依赖流本身的组织。无论哪种方式,您都需要非常精确地写下序列化格式;经验法则是,有人应该能够从头开始编写代码,生成或使用序列化,而不需要除您编写的规范之外的任何信息。

这是序列化您显示的数据结构的一种可能方法:

# Each row is a 32-bit unsigned value in network byte order.
| number of pairs following     |
| [0].value1                    |
| [0].value2                    |
| [1].value1                    |
| [2].value2                    |
  ...
| [N].value1                    |
| [N].value2                    |

在 TCP 和 IP RFC 或 PNG 规范中可以找到很好的例子——如何做这类事情以及如何记录它。

于 2011-02-07T20:12:26.777 回答
0

请记住,结构可能包含任意数量的填充字节。这在编写任何形式的数据协议时尤其麻烦。如果在其上使用 sizeof(),则必须确保编译器已禁用填充。可移植的方式是逐个成员遍历结构成员并发送它们。

于 2011-02-07T21:16:22.623 回答
0

你可以这样做:

struct pack2        *p;

p = (struct pack2 *) malloc( sizeof(struct pack2) + 1024 );
p->data_size = 1024;
p->data = (char *) p + sizeof(struct pack2);

唯一需要注意的是,您必须确保目标平台在 data_size 中保持原始平台的字节序,并且您必须确保 struct pack2 在两个平台上的大小相同。

于 2011-02-07T20:11:56.430 回答