TYPECVT.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1993-1997 Microsoft Corporation
  3. Module Name:
  4.     typecvt.h
  5. Abstract:
  6.     Header file for typecvt.c.  Contains any defines, structures and prototypes
  7.     which are needed by programs to call the typecvt routines.
  8. --*/
  9. // Make sure we are not already defined.
  10. #ifndef _TYPECVT_
  11. #define _TYPECVT_
  12. //
  13. // The following preprocessor directives are used to control possible
  14. // differences between the way integers are stored on the machine and
  15. // how they are stored in the file.  Normally Intel and MIPS chips will
  16. // all be little endian so these should not be necessray.  Some time in
  17. // the future we may port to a machine which is only big endian.
  18. // If this is the case CVT_BIG_ENDIAN_SUPPORT should be defined.
  19. //
  20. //
  21. // The following defines are used to set the type of source and destination
  22. // structures.  For those of us who are confused by little endian and big
  23. // endian formats, here is a breif recap.
  24. //
  25. // Little Endian:  (This is used on Intel chips.  The MIPS chip is switchable
  26. //      but for NT is will run in little endian format.)
  27. //    This is where the high order bytes of a short or long are stored higher
  28. //    in memory.  For example the number 0x80402010 is stored as follows.
  29. //      Address:        Value:
  30. //          00            10
  31. //          01            20
  32. //          02            40
  33. //          03            80
  34. //    This looks backwards when memory is dumped in order: 10 20 40 80
  35. //
  36. // Big Endian:  (This is not currently used on any NT systems but hey, this
  37. //      is supposed to be portable!!)
  38. //    This is where the high order bytes of a short or long are stored lower
  39. //    in memory.  For example the number 0x80402010 is stored as follows.
  40. //      Address:        Value:
  41. //          00            80
  42. //          01            40
  43. //          02            20
  44. //          03            10
  45. //    This looks correct when memory is dumped in order: 80 40 20 10
  46. //
  47. #define   CVT_ENDIAN_UNKNOWN  0   // Endian type is unknown. (do not use).
  48. #define   CVT_LITTLE_ENDIAN   1   // Format is little endian.
  49. #define   CVT_BIG_ENDIAN      2   // Format is big endian.
  50. //
  51. // Define the endian type of the file.  CVT_FILE_ENDIAN_DEFAULT defines how
  52. // most files are stored on disk.  The default is in little endian since most
  53. // Microsoft standards are set based on the Intel chip.
  54. //
  55. #define         CVT_FILE_ENDIAN_DEFAULT        CVT_LITTLE_ENDIAN
  56. //
  57. // The following variables are used to make "changeable defines."   They
  58. // allow the caller to specify a constant which changes from system to
  59. // system.
  60. //
  61. extern INT vfFileEndianType;
  62. extern INT vfSysEndianType;
  63. #define   CVT_ENDIAN_FILE     vfFileEndianType
  64. #define   CVT_ENDIAN_SYSTEM   vfSysEndianType
  65. //
  66. // Fake structure used to determine system alignment type.
  67. //
  68. struct tagAlignmentCheck
  69. {
  70. char chElem1; // Note that this structure will be different
  71. long   lElem2; // sizes based on the system alignment scheme.
  72. // The different values follow.
  73. };
  74. //
  75. // Note that the following defines must correspond to the size of the
  76. // preceeding structure in different packing schemes.
  77. //
  78. #define   CVT_ALIGN_PACKED      5   // Packed = 1-byte boundry ...
  79. #define   CVT_ALIGN_WORD        6   // WORD = 2-byte boundry ...
  80. #define   CVT_ALIGN_DWORD       8   // DWORD = 4-byte boundry ...
  81. //
  82. // The following will correspond to one of the above alignment methods and
  83. // will then reflect the system that this is compiled under.
  84. //
  85. #define   CVT_ALIGN_SYSTEM      sizeof(struct tagAlignmentCheck)
  86. //
  87. // The next two structures are the heart of the conversion process.  The
  88. // goal here is to describe two structures individually.  Each element should
  89. // be defined in a SDI structure.  An array of these structures will make up
  90. // the complete definition.
  91. //
  92. typedef struct tagStructDefineInfo
  93. {
  94.     INT     cTypeSize;          // Size of type. (ex. sizeof (int)).
  95.     INT     cActualSize;        // Actual size (ex. sizeof (cTypeSize)).
  96.     INT     oPackedAlign;       // Offset of element in PACKED alginment.
  97.     INT     oWordAlign;         // Offset of element in WORD alginment.
  98.     INT     oDWordAlign;        // Offset of element in DWORD alginment.
  99. } SDI, * PSDI;
  100. //
  101. // Prototypes for base functions which user can call to perfom the conversion.
  102. //
  103. LONG
  104. lCalculateStructOffsets (
  105.      PSDI    rgsdiStructDefine,
  106.      INT     fAlignmentType,
  107.   INT             cSizeOfStruct
  108.     );
  109. VOID
  110. vPerformConversion (
  111.      PSDI    rgsdiStructDefine,
  112.      PBYTE   pjSrcBuffer,
  113.  INT fSrcAlignment,
  114.  INT fSrcEndianType,
  115.     PBYTE   pjDestBuffer,
  116.  INT fDestAlignment,
  117.  INT fDestEndianType
  118.     );
  119. VOID
  120. vSetFileEndianType (
  121.     BOOL     fNewEndianType
  122.     );
  123. INT
  124. fDetermineSysEndianType (
  125. VOID
  126.     );
  127. //
  128. // Prototypes for convertion functions available to external programs.
  129. // These functions are never actually used by
  130. //
  131. VOID
  132. vCharToShort (
  133.           PBYTE  pjSrc,
  134.          PBYTE  pjDest
  135.          );
  136. VOID
  137. vCharToUShort (
  138.           PBYTE  pjSource,
  139.          PBYTE  pjDest
  140.          );
  141. VOID
  142. vCharToLong (
  143.           PBYTE  pjSource,
  144.          PBYTE  pjDest
  145.          );
  146. VOID
  147. vCharToULong (
  148.           PBYTE  pjSource,
  149.          PBYTE  pjDest
  150.          );
  151. VOID
  152. vShortToShort (
  153.           PBYTE  pjSource,
  154.          PBYTE  pjDest
  155.          );
  156. VOID
  157. vShortToLong (
  158.           PBYTE  pjSource,
  159.          PBYTE  pjDest
  160.          );
  161. VOID
  162. vShortToULong (
  163.           PBYTE  pjSource,
  164.          PBYTE  pjDest
  165.          );
  166. VOID
  167. vLongToLong (
  168.           PBYTE  pjSource,
  169.          PBYTE  pjDest
  170.          );
  171. VOID
  172. vLongToShort (
  173.           PBYTE  pjSource,
  174.          PBYTE  pjDest
  175.          );
  176. VOID
  177. vLongToChar (
  178.           PBYTE  pjSource,
  179.          PBYTE  pjDest
  180.          );
  181. VOID
  182. vShortToChar (
  183.           PBYTE  pjSource,
  184.          PBYTE  pjDest
  185.          );
  186. //
  187. // The following functions are the ones called by the utility functions.
  188. // They could also be used in some other situations so I will make them
  189. // public.
  190. //
  191. SHORT
  192. sSHORTFromSrcBuff (
  193.          PBYTE   pjSrc
  194.     );
  195. USHORT
  196. usUSHORTFromSrcBuff (
  197.          PBYTE   pjSrc
  198.     );
  199. LONG
  200. lLONGFromSrcBuff (
  201.          PBYTE   pjSrc
  202.     );
  203. ULONG
  204. ulULONGFromSrcBuff (
  205.          PBYTE   pjSrc
  206.     );
  207. VOID
  208. vDestBuffFromSHORT (
  209.          SHORT   sSource,
  210.         PBYTE   pjDest
  211.     );
  212. VOID
  213. vDestBuffFromUSHORT (
  214.          USHORT  usSource,
  215.         PBYTE   pjDest
  216.     );
  217. VOID
  218. vDestBuffFromLONG (
  219.          LONG    lSource,
  220.         PBYTE   pjDest
  221.     );
  222. VOID
  223. vDestBuffFromULONG (
  224.          ULONG   ulSource,
  225.         PBYTE   pjDest
  226.     );
  227. #endif  // _TYPECVT_