XSD defines the following types that are mapped to a C binary type structure:
hexBinary
base64Binary
The type of structure used depends on whether or not a length facet is applied to the type. If a length facet is not used, or the length is a very large value (> 32K), a built-in type containing a pointer to a dynamic memory buffer is used to hold the binary data. If -x64 was specified, OSDynOctStr64 is used. Otherwise, OSDynOctStr is used. The definition of these types in osSysTypes.h is as follows:
typedef struct OSDynOctStr { OSUINT32 numocts; const OSOCTET* data; } OSDynOctStr; typedef struct OSDynOctStr64 { OSSIZE numocts; OSOCTET* data; } OSDynOctStr64;
The numocts member holds the length of the binary string and the data member holds the actual data.
For C++, a built-in class definition is used that extends this structure:
class OSDynOctStrClass : public OSRTBaseType { protected: OSSIZE numocts; const OSOCTET* data; public: ... } ;
This class provides methods for getting and setting the data values as well as initialization through constructors and other utility methods.
If a length facet is used that restricts the size of the binary string to a value less than 32K, a custom type is generated that contains a static array to hold the data. The general form of this type is as follows:
typedef struct TypeName { OSUINT32 numocts; OSOCTET data[length]; } TypeName;
If -x64 was used, numocts will be of type OSSIZE.
In this case, TypeName would be the name of the type defined in the XSD specification and length would be the value of the length facet.
In the case of C++, a class is generated:
class TypeName : public OSRTBaseType { OSUINT32 numocts; OSOCTET data[length]; ... } ;
If -x64 was used, numocts will be of type OSSIZE.
The general mappings for each case are as follows: