Clone of Akilla's ac2d @ https://github.com/deregtd/AC2D

cByteStream.cpp 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "StdAfx.h"
  2. #include ".\cbytestream.h"
  3. cByteStream::cByteStream(void)
  4. {
  5. m_pbDataStart = NULL;
  6. m_pbDataPtr = NULL;
  7. m_dwLength = NULL;
  8. }
  9. cByteStream::~cByteStream(void)
  10. {
  11. }
  12. cByteStream::cByteStream(BYTE *Data, DWORD Length)
  13. {
  14. SetStream(Data, Length);
  15. }
  16. void cByteStream::SetStream(BYTE *Data, DWORD Length)
  17. {
  18. m_pbDataPtr = m_pbDataStart = Data;
  19. m_dwLength = Length;
  20. }
  21. DWORD cByteStream::GetOffset()
  22. {
  23. return (DWORD) (m_pbDataPtr - m_pbDataStart);
  24. }
  25. bool cByteStream::AtEOF()
  26. {
  27. return (GetOffset() >= m_dwLength);
  28. }
  29. void cByteStream::ReadBegin( void )
  30. {
  31. m_pbDataPtr = m_pbDataStart;
  32. }
  33. void cByteStream::ReadAlign( void )
  34. {
  35. int iOffset = (int) (m_pbDataPtr - m_pbDataStart);
  36. if ( (iOffset & 3) != 0)
  37. m_pbDataPtr += (4 - (iOffset & 3));
  38. // if ( (iOffset % 4) != 0)
  39. // m_pbDataPtr += (4 - (iOffset % 4));
  40. }
  41. void cByteStream::ReadSkip(int iAmount)
  42. {
  43. m_pbDataPtr += iAmount;
  44. }
  45. //Ew, =)
  46. BYTE cByteStream::ReadByte() {
  47. BYTE Result = *((BYTE *)m_pbDataPtr);
  48. m_pbDataPtr += sizeof(BYTE);
  49. return Result;
  50. }
  51. WORD cByteStream::ReadWORD() {
  52. WORD Result = *((WORD *)m_pbDataPtr);
  53. m_pbDataPtr += sizeof(WORD);
  54. return Result;
  55. }
  56. DWORD cByteStream::ReadDWORD() {
  57. DWORD Result = *((DWORD *)m_pbDataPtr);
  58. m_pbDataPtr += sizeof(DWORD);
  59. return Result;
  60. }
  61. QWORD cByteStream::ReadQWORD() {
  62. QWORD Result = *((QWORD *)m_pbDataPtr);
  63. m_pbDataPtr += sizeof(QWORD);
  64. return Result;
  65. }
  66. WORD cByteStream::ReadPackedWORD() {
  67. WORD Result = *((BYTE *)m_pbDataPtr);
  68. m_pbDataPtr += sizeof(BYTE);
  69. if (Result & 0x80)
  70. {
  71. Result <<= 8;
  72. Result &= 0x7FFF;
  73. Result |= *((BYTE *)m_pbDataPtr);
  74. m_pbDataPtr += sizeof(BYTE);
  75. }
  76. return Result;
  77. }
  78. DWORD cByteStream::ReadPackedDWORD() {
  79. DWORD Result = *((WORD *)m_pbDataPtr);
  80. m_pbDataPtr += sizeof(WORD);
  81. if (Result & 0x8000)
  82. {
  83. Result <<= 16;
  84. Result &= 0x7FFFFFFF;
  85. Result |= *((WORD *)m_pbDataPtr);
  86. m_pbDataPtr += sizeof(WORD);
  87. }
  88. return Result;
  89. }
  90. float cByteStream::ReadFloat() {
  91. float Result = *((float *)m_pbDataPtr);
  92. m_pbDataPtr += sizeof(float);
  93. return Result;
  94. }
  95. double cByteStream::ReadDouble() {
  96. double Result = *((double *)m_pbDataPtr);
  97. m_pbDataPtr += sizeof(double);
  98. return Result;
  99. }
  100. char* cByteStream::ReadString() {
  101. WORD wStrLen = ReadWORD();
  102. char* Result = new char[wStrLen+1];
  103. Result[wStrLen] = 0;
  104. memcpy(Result, m_pbDataPtr, wStrLen);
  105. m_pbDataPtr += wStrLen;
  106. ReadAlign();
  107. return Result;
  108. }
  109. wchar_t* cByteStream::ReadWString() {
  110. WORD wStrLen = ReadWORD();
  111. wchar_t* Result = new wchar_t[wStrLen+1];
  112. Result[wStrLen] = 0;
  113. memcpy(Result, m_pbDataPtr, 2*wStrLen);
  114. m_pbDataPtr += wStrLen*2;
  115. ReadAlign();
  116. return Result;
  117. }
  118. char * cByteStream::ReadEncodedString()
  119. {
  120. WORD wLength = ReadWORD();
  121. WORD wCount = 0;
  122. char *szTemp = new char[ wLength + 4 ];
  123. memset( szTemp, 0, wLength + 4 );
  124. long lTell = (long) (m_pbDataPtr - m_pbDataStart);
  125. if( lTell % 4 )
  126. {
  127. memcpy(szTemp, ReadGroup(2), 2);
  128. wCount += 2;
  129. }
  130. for(; wCount < wLength; wCount += 4)
  131. memcpy(szTemp + wCount, ReadGroup(4), 4);
  132. //if( bNibbled )
  133. if (true)
  134. {
  135. char *temp;
  136. for( temp = szTemp; *temp; ++temp )
  137. {
  138. WORD c = *(BYTE *) temp;
  139. WORD c2 = c >> 4;
  140. c <<= 4;
  141. *temp = (c | c2);
  142. }
  143. }
  144. return szTemp;
  145. }
  146. BYTE * cByteStream::ReadGroup(int iAmount)
  147. {
  148. BYTE * Result = m_pbDataPtr;
  149. m_pbDataPtr += iAmount;
  150. return Result;
  151. }