【问题标题】:Marshalling of a 32 bit int to a 16 bit int maching将 32 位 int 编组到 16 位 int 机器
【发布时间】:2011-02-19 10:56:21
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • 您想向接收 16 位整数的插槽发送一个 32 位整数并且不丢失任何信息?祝你好运。
  • 不,不是真的,我问的是在 RPC 中这实际上是如何发生的? RPC 设计是否 来选择与IDL 定义类型匹配的局部变量?如果是这样的话,遗留代码不会被直接替换为仅仅通过 rpc 调用而不是任何花哨的东西。

标签: language-agnostic serialization marshalling rpc


【解决方案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))。

【讨论】:

  • 好的,RPC 程序员在通过 RPC 使用调用时必须遵守该定义。谢谢,明白了。
猜你喜欢
  • 2011-08-14
  • 2010-10-31
  • 2011-03-05
  • 2015-08-03
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 2014-07-25
相关资源
最近更新 更多