Выделение 32-битных и 16-битных обработок - PullRequest
0 голосов
/ 19 февраля 2011

Я хочу реализовать и понять концепцию маршаллинга по моему собственному механизму RPC (игрушка действительно). Хотя я понимаю идею порядка байтов, я не знаю, как обрабатывать 32-битные и 16-битные целочисленные значения. Таким образом, проблема в том, что машина A имеет представленное int в 32-битной среде, и она хочет вызвать функцию int foo (int x) через вызов rpc; однако сервер, на котором представлен этот int, является 16-битным. Отправка только младших 16 битов приведет к потере информации и нежелательна.

Я знаю работу IDL по решению этой проблемы. Но в этом случае, допустим, я использую IDL, который «определяет» int как 32-битный. Хотя этот случай работает для моего сценария, в случае машины A с 16-битным int 2 байта всегда будут потрачены впустую при передаче по сети.

Если мы перевернем IDL на 16 бит, то пользователь должен будет вручную разделить свой локальный int и сделать что-то причудливое, полностью нарушив прозрачность RPC.

Так какой же правильный путь используется в реальных реализациях?

спасибо.

1 Ответ

1 голос
/ 19 февраля 2011

Обычно IDL определяют несколько независимых от платформы типов (UInt8, Int8, UInt16, Int16, UInt32, Int32, UInt64, Int64) и несколько зависимых от платформы, таких как int, uint.Зависимые от платформы типы имеют только ограниченное использование, например размер / индекс массивов.Для всего остального рекомендуется использовать независимые от платформы типы.

Если параметр объявлен в IDL как Int32, то на любой платформе он ДОЛЖЕН быть Int32.Если он объявлен как Int, то это зависит от платформы.

Например, COM VARENUM и VARIANT , поскольку вы можете видеть, что существуют независимые от платформы типы (напримерSHORT (VT_UI2), LONG (VT_UI4), LONGLONG (VT_UI8)), а также типы машин (например, INT (VT_INT)).

...