DataStream.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. #include "DataStream.h"
  2. USING_NS_BF;
  3. DataStream::DataStream()
  4. {
  5. mBigEndian = false;
  6. mBitPos = 0;
  7. mReadBitIntPos = -1000;
  8. }
  9. int8 DataStream::ReadInt8()
  10. {
  11. int8 anInt8;
  12. Read(&anInt8, sizeof(int8));
  13. return anInt8;
  14. }
  15. uint8 DataStream::ReadUInt8()
  16. {
  17. return (uint8) ReadInt8();
  18. }
  19. int16 DataStream::ReadInt16()
  20. {
  21. int16 anInt16;
  22. Read(&anInt16, sizeof(int16));
  23. if (mBigEndian)
  24. return FromBigEndian(anInt16);
  25. return anInt16;
  26. }
  27. uint16 DataStream::ReadUInt16()
  28. {
  29. return (uint16) ReadInt16();
  30. }
  31. int32 DataStream::ReadInt32()
  32. {
  33. int32 anInt32;
  34. Read(&anInt32, sizeof(int32));
  35. if (mBigEndian)
  36. return FromBigEndian(anInt32);
  37. return anInt32;
  38. }
  39. int64 Beefy::DataStream::ReadInt64()
  40. {
  41. int64 anInt64;
  42. Read(&anInt64, sizeof(int64));
  43. //if (mBigEndian)
  44. //return FromBigEndian(anInt32);
  45. return anInt64;
  46. }
  47. float DataStream::ReadFloat()
  48. {
  49. if (mBigEndian)
  50. {
  51. int32 anInt32;
  52. Read(&anInt32, sizeof(int32));
  53. anInt32 = FromBigEndian(anInt32);
  54. return *((float*) &anInt32);
  55. }
  56. else
  57. {
  58. float aFloat;
  59. Read(&aFloat, sizeof(float));
  60. return aFloat;
  61. }
  62. }
  63. double DataStream::ReadDouble()
  64. {
  65. if (mBigEndian)
  66. {
  67. int64 anInt64;
  68. Read(&anInt64, sizeof(int64));
  69. anInt64 = FromBigEndian(anInt64);
  70. return *((double*) &anInt64);
  71. }
  72. else
  73. {
  74. double aDouble;
  75. Read(&aDouble, sizeof(double));
  76. return aDouble;
  77. }
  78. }
  79. String DataStream::ReadAscii8SizedString()
  80. {
  81. int size = (int) (uint8) ReadInt8();
  82. String aString;
  83. aString.Append(' ', size);
  84. Read((void*) aString.c_str(), size);
  85. return aString;
  86. }
  87. String DataStream::ReadAscii32SizedString()
  88. {
  89. int size = (int) ReadInt32();
  90. if (size == 0)
  91. return String();
  92. String aString;
  93. aString.Append(' ', size);
  94. Read((void*) aString.c_str(), size);
  95. return aString;
  96. }
  97. String DataStream::ReadUnicode32SizedString()
  98. {
  99. int size = ReadInt32();
  100. UTF16String aString;
  101. aString.ResizeRaw(size + 1);
  102. aString[size] = 0;
  103. Read((void*)aString.c_str(), size * 2);
  104. if (mBigEndian)
  105. for (int i = 0; i < (int) aString.length(); i++)
  106. aString[i] = FromBigEndian((int16) aString[i]);
  107. return UTF8Encode(aString);
  108. }
  109. String DataStream::ReadSZ()
  110. {
  111. String str;
  112. while (true)
  113. {
  114. char c = (char)ReadUInt8();
  115. if (c == 0)
  116. break;
  117. str += c;
  118. }
  119. return str;
  120. }
  121. void DataStream::SyncBitPos()
  122. {
  123. mBitPos = GetPos() * 8;
  124. }
  125. void DataStream::SyncBytePos()
  126. {
  127. SetPos((mBitPos+7) / 8);
  128. }
  129. //int bitMaskR[32] = {
  130. static int LowerBitMask[33] = {0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF,
  131. 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF,
  132. 0x7FFFFFFF, (int)0xFFFFFFFF};
  133. int DataStream::ReadUBits(int bits)
  134. {
  135. int val = 0;
  136. int valBitPos = 0;
  137. while (true)
  138. {
  139. int bitsAvail = (mReadBitIntPos + 32) - mBitPos;
  140. if ((bitsAvail > 0) && (bitsAvail <= 32))
  141. {
  142. int copyBits = std::min(bits - valBitPos, bitsAvail);
  143. val |= ((mCurBitInt >> (32 - bitsAvail)) & LowerBitMask[copyBits]) << valBitPos;
  144. valBitPos += copyBits;
  145. mBitPos += copyBits;
  146. }
  147. if (valBitPos == bits)
  148. break;
  149. mReadBitIntPos = mBitPos & ~7;
  150. SetPos(mReadBitIntPos / 8);
  151. Read(&mCurBitInt, 4);
  152. }
  153. return val;
  154. }
  155. void DataStream::SeekBits(int bits)
  156. {
  157. mBitPos += bits;
  158. }
  159. void Beefy::DataStream::Write(int32 val)
  160. {
  161. Write(&val, sizeof(int32));
  162. }
  163. void Beefy::DataStream::Write(int64 val)
  164. {
  165. Write(&val, sizeof(int64));
  166. }
  167. void Beefy::DataStream::Write(const StringImpl& val)
  168. {
  169. Write((int)val.length());
  170. Write((void*)val.c_str(), (int)val.length());
  171. }
  172. void DataStream::Write(DataStream& refStream)
  173. {
  174. int size = refStream.GetSize();
  175. uint8* data = new uint8[size];
  176. refStream.SetPos(0);
  177. refStream.Read(data, size);
  178. Write(data, size);
  179. delete [] data;
  180. }
  181. void DataStream::WriteSNZ(const StringImpl& val)
  182. {
  183. Write((void*)val.c_str(), (int)val.length());
  184. }
  185. void DataStream::WriteSZ(const StringImpl& val)
  186. {
  187. Write((void*)val.c_str(), (int)val.length() + 1);
  188. }
  189. void Beefy::DataStream::Write(float val)
  190. {
  191. Write(&val, sizeof(float));
  192. }
  193. void DataStream::Write(uint8 val)
  194. {
  195. Write(&val, 1);
  196. }
  197. void DataStream::Write(int8 val)
  198. {
  199. Write((uint8)val);
  200. }
  201. void DataStream::Write(int16 val)
  202. {
  203. Write(&val, 2);
  204. }
  205. void DataStream::WriteZeros(int size)
  206. {
  207. int sizeLeft = size;
  208. while (sizeLeft > 0)
  209. {
  210. if (sizeLeft >= 8)
  211. {
  212. Write((int64)0);
  213. sizeLeft -= 8;
  214. }
  215. else if (sizeLeft >= 4)
  216. {
  217. Write((int32)0);
  218. sizeLeft -= 4;
  219. }
  220. else if (sizeLeft >= 2)
  221. {
  222. Write((int16)0);
  223. sizeLeft -= 2;
  224. }
  225. else
  226. {
  227. Write((int8)0);
  228. sizeLeft -= 1;
  229. }
  230. }
  231. }
  232. void DataStream::Align(int alignSize)
  233. {
  234. int curPos = GetPos();
  235. int alignBytesLeft = (alignSize - (curPos % alignSize)) % alignSize;
  236. WriteZeros(alignBytesLeft);
  237. }