将32位int编组到16位int机器

时间:2011-02-19 10:56:22

标签: language-agnostic serialization marshalling rpc

我想实现并理解对我自己的rpc机制进行编组的概念(玩具真的)。虽然我得到了endian-ness背后的想法,但我不确定如何处理32位和16位整数。所以问题是机器A有32位的int,它想通过rpc调用调用函数int foo(int x);但是,表示此int的服务器是16位。仅发送低16位会丢失信息,这是不可取的。

我知道IDL解决这个问题的工作。但在这种情况下,我可以说我使用一个“定义”int为32位的IDL。虽然这种情况适用于我的场景,但在机器A具有16位int的情况下,当通过网络传输时总是浪费2个字节。

如果我们将IDL翻转为16位,那么用户必须手动拆分其本地int并做一些奇特的事情,完全打破了RPC的透明度。

那么在实际实现中使用的正确方法是什么?

感谢。

1 个答案:

答案 0 :(得分:1)

通常,IDL定义了几种与平台无关的类型(UInt8,Int8,UInt16,Int16,UInt32,Int32,UInt64,Int64)以及很少依赖于平台的类型,例如int,uint。平台相关类型仅具有有限的用途,例如数组的大小/索引。建议使用与平台无关的类型。

如果参数在IDL中声明为Int32,那么在任何平台上它都必须是Int32。如果它被声明为Int,那么它取决于平台。

例如,COM VARENUMVARIANT,您可以看到存在平台无关类型(例如SHORT(VT_UI2),LONG(VT_UI4),LONGLONG(VT_UI8))以及机器类型(例如INT(VT_INT))。