tc_pack.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. #include "util/tc_platform.h"
  2. #include "util/tc_pack.h"
  3. #include <iostream>
  4. #include <string.h>
  5. #if TARGET_PLATFORM_LINUX
  6. #include <arpa/inet.h>
  7. #endif
  8. namespace tars
  9. {
  10. #if TARGET_PLATFORM_WINDOWS
  11. #pragma comment(lib,"ws2_32.lib")
  12. #endif
  13. #if TARGET_PLATFORM_IOS || TARGET_PLATFORM_WINDOWS||TARGET_PLATFORM_LINUX
  14. # ifndef __LITTLE_ENDIAN
  15. # define __LITTLE_ENDIAN 1234
  16. # endif
  17. # ifndef __BIG_ENDIAN
  18. # define __BIG_ENDIAN 4321
  19. # endif
  20. # ifndef __BYTE_ORDER
  21. # define __BYTE_ORDER __LITTLE_ENDIAN
  22. # endif
  23. #endif
  24. #if __BYTE_ORDER == __BIG_ENDIAN
  25. # define pack_ntohll(x) (x)
  26. # define pack_htonll(x) (x)
  27. # define pack_ntohf(x) (x)
  28. # define pack_htonf(x) (x)
  29. # define pack_ntohd(x) (x)
  30. # define pack_htond(x) (x)
  31. #else
  32. # if __BYTE_ORDER == __LITTLE_ENDIAN
  33. # define pack_ntohll(x) pack_htonll(x)
  34. union pack_bswap_helper
  35. {
  36. int64_t i64;
  37. int32_t i32[2];
  38. };
  39. inline int64_t pack_htonll(int64_t x)
  40. {
  41. pack_bswap_helper h;
  42. h.i64 = x;
  43. int64_t tmp = htonl(h.i32[1]);
  44. h.i32[1] = htonl(h.i32[0]);
  45. h.i32[0] = tmp;
  46. return h.i64;
  47. }
  48. inline float pack_ntohf(float x)
  49. {
  50. union {
  51. float f;
  52. int32_t i32;
  53. } helper;
  54. helper.f = x;
  55. helper.i32 = htonl( helper.i32 );
  56. return helper.f;
  57. }
  58. # define pack_htonf(x) pack_ntohf(x)
  59. inline double pack_ntohd(double x)
  60. {
  61. union {
  62. double d;
  63. int64_t i64;
  64. } helper;
  65. helper.d = x;
  66. helper.i64 = pack_htonll( helper.i64 );
  67. return helper.d;
  68. }
  69. # define pack_htond(x) pack_ntohd(x)
  70. # endif
  71. #endif
  72. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (bool t)
  73. {
  74. _buffer.append(sizeof(bool), (char)t);
  75. return *this;
  76. }
  77. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (char t)
  78. {
  79. _buffer.append(sizeof(char), (char)t);
  80. return *this;
  81. }
  82. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned char t)
  83. {
  84. (*this) << (char)t;
  85. return *this;
  86. }
  87. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (short t)
  88. {
  89. t = htons(t);
  90. _buffer.append((const char *)&t, sizeof(t));
  91. return *this;
  92. }
  93. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned short t)
  94. {
  95. (*this) << (short)t;
  96. return *this;
  97. }
  98. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (int t)
  99. {
  100. t = htonl(t);
  101. _buffer.append((const char *)&t, sizeof(int));
  102. return *this;
  103. }
  104. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned int t)
  105. {
  106. (*this) << (int)t;
  107. return *this;
  108. }
  109. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (long t)
  110. {
  111. if(sizeof(long) == 8)
  112. {
  113. t = pack_htonll(t);
  114. }
  115. else
  116. {
  117. t = htonl(t);
  118. }
  119. _buffer.append((const char *)&t, sizeof(long));
  120. return *this;
  121. }
  122. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned long t)
  123. {
  124. if(sizeof(unsigned long) == 8)
  125. {
  126. t = pack_htonll(t);
  127. }
  128. else
  129. {
  130. t = htonl(t);
  131. }
  132. _buffer.append((const char *)&t, sizeof(unsigned long));
  133. return *this;
  134. }
  135. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (long long t)
  136. {
  137. t = pack_htonll(t);
  138. _buffer.append((const char *)&t, sizeof(long long));
  139. return *this;
  140. }
  141. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned long long t)
  142. {
  143. t = pack_htonll(t);
  144. _buffer.append((const char *)&t, sizeof(unsigned long long));
  145. return *this;
  146. }
  147. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (float t)
  148. {
  149. t = pack_htonf(t);
  150. _buffer.append((const char *)&t, sizeof(float));
  151. return *this;
  152. }
  153. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (double t)
  154. {
  155. t = pack_htond(t);
  156. _buffer.append((const char *)&t, sizeof(double));
  157. return *this;
  158. }
  159. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (const char *sBuffer)
  160. {
  161. _buffer.append(sBuffer, strlen(sBuffer) + 1);
  162. return *this;
  163. }
  164. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (const string& sBuffer)
  165. {
  166. uint32_t len = (uint32_t)sBuffer.length();
  167. if(len < 255)
  168. {
  169. unsigned char c = (unsigned char)len;
  170. (*this) << c;
  171. }
  172. else
  173. {
  174. unsigned char c = 255;
  175. (*this) << c;
  176. (*this) << len;
  177. }
  178. _buffer.append(sBuffer);
  179. return *this;
  180. }
  181. TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (const TC_PackIn& pi)
  182. {
  183. _buffer.append(pi.topacket());
  184. return (*this);
  185. }
  186. /************************************************************************/
  187. bool TC_PackOut::isEnd()
  188. {
  189. if(_pos >= _length)
  190. {
  191. return true;
  192. }
  193. return false;
  194. }
  195. TC_PackOut& TC_PackOut::operator >> (bool &t)
  196. {
  197. size_t len = sizeof(bool);
  198. if(_pos + len > _length)
  199. {
  200. throw TC_PackOut_Exception("TC_PackOut read bool error.");
  201. }
  202. memcpy(&t, _pbuffer + _pos, len);
  203. _pos += len;
  204. return *this;
  205. }
  206. TC_PackOut& TC_PackOut::operator >> (char &t)
  207. {
  208. size_t len = sizeof(char);
  209. if(_pos + len > _length)
  210. {
  211. throw TC_PackOut_Exception("TC_PackOut read char error.");
  212. }
  213. memcpy(&t, _pbuffer + _pos, len);
  214. _pos += len;
  215. return *this;
  216. }
  217. TC_PackOut& TC_PackOut::operator >> (unsigned char &t)
  218. {
  219. size_t len = sizeof(unsigned char);
  220. if(_pos + len > _length)
  221. {
  222. throw TC_PackOut_Exception("TC_PackOut read unsigned char error.");
  223. }
  224. memcpy(&t, _pbuffer + _pos, len);
  225. _pos += len;
  226. return *this;
  227. }
  228. TC_PackOut& TC_PackOut::operator >> (short &t)
  229. {
  230. size_t len = sizeof(short);
  231. if(_pos + len > _length)
  232. {
  233. throw TC_PackOut_Exception("TC_PackOut read short error.");
  234. }
  235. memcpy(&t, _pbuffer + _pos, len);
  236. t = ntohs(t);
  237. _pos += len;
  238. return *this;
  239. }
  240. TC_PackOut& TC_PackOut::operator >> (unsigned short &t)
  241. {
  242. size_t len = sizeof(unsigned short);
  243. if(_pos + len > _length)
  244. {
  245. throw TC_PackOut_Exception("TC_PackOut read unsigned short error.");
  246. }
  247. memcpy(&t, _pbuffer + _pos, len);
  248. t = ntohs(t);
  249. _pos += len;
  250. return *this;
  251. }
  252. TC_PackOut& TC_PackOut::operator >> (int &t)
  253. {
  254. size_t len = sizeof(int);
  255. if(_pos + len > _length)
  256. {
  257. throw TC_PackOut_Exception("TC_PackOut read int error.");
  258. }
  259. memcpy(&t, _pbuffer + _pos, len);
  260. t = ntohl(t);
  261. _pos += len;
  262. return *this;
  263. }
  264. TC_PackOut& TC_PackOut::operator >> (unsigned int &t)
  265. {
  266. size_t len = sizeof(unsigned int);
  267. if(_pos + len > _length)
  268. {
  269. throw TC_PackOut_Exception("TC_PackOut read unsigned int error.");
  270. }
  271. memcpy(&t, _pbuffer + _pos, len);
  272. t = ntohl(t);
  273. _pos += len;
  274. return *this;
  275. }
  276. TC_PackOut& TC_PackOut::operator >> (long &t)
  277. {
  278. size_t len = sizeof(long);
  279. if(_pos + len > _length)
  280. {
  281. throw TC_PackOut_Exception("TC_PackOut read long error.");
  282. }
  283. memcpy(&t, _pbuffer + _pos, len);
  284. if(sizeof(unsigned long) == 8)
  285. {
  286. t = pack_ntohll(t);
  287. }
  288. else
  289. {
  290. t = ntohl(t);
  291. }
  292. _pos += len;
  293. return *this;
  294. }
  295. TC_PackOut& TC_PackOut::operator >> (unsigned long &t)
  296. {
  297. size_t len = sizeof(unsigned long);
  298. if(_pos + len > _length)
  299. {
  300. throw TC_PackOut_Exception("TC_PackOut read long error.");
  301. }
  302. memcpy(&t, _pbuffer + _pos, len);
  303. if(sizeof(unsigned long) == 8)
  304. {
  305. t = pack_ntohll(t);
  306. }
  307. else
  308. {
  309. t = ntohl(t);
  310. }
  311. _pos += len;
  312. return *this;
  313. }
  314. TC_PackOut& TC_PackOut::operator >> (long long &t)
  315. {
  316. size_t len = sizeof(long long);
  317. if(_pos + len > _length)
  318. {
  319. throw TC_PackOut_Exception("TC_PackOut read long long error.");
  320. }
  321. memcpy(&t, _pbuffer + _pos, len);
  322. t = pack_ntohll(t);
  323. _pos += len;
  324. return *this;
  325. }
  326. TC_PackOut& TC_PackOut::operator >> (unsigned long long &t)
  327. {
  328. size_t len = sizeof(unsigned long long);
  329. if(_pos + len > _length)
  330. {
  331. throw TC_PackOut_Exception("TC_PackOut read long long error.");
  332. }
  333. memcpy(&t, _pbuffer + _pos, len);
  334. t = pack_ntohll(t);
  335. _pos += len;
  336. return *this;
  337. }
  338. TC_PackOut& TC_PackOut::operator >> (float &f)
  339. {
  340. if(_pos + sizeof(float) > _length)
  341. {
  342. throw TC_PackOut_Exception("TC_PackOut read float error.");
  343. }
  344. memcpy(&f, _pbuffer + _pos, sizeof(float));
  345. f = pack_ntohf(f);
  346. _pos += sizeof(float);
  347. return *this;
  348. }
  349. TC_PackOut& TC_PackOut::operator >> (double &f)
  350. {
  351. if(_pos + sizeof(double) > _length)
  352. {
  353. throw TC_PackOut_Exception("TC_PackOut read double error.");
  354. }
  355. memcpy(&f, _pbuffer + _pos, sizeof(double));
  356. f = pack_ntohd(f);
  357. _pos += sizeof(double);
  358. return *this;
  359. }
  360. TC_PackOut& TC_PackOut::operator >> (char *sBuffer)
  361. {
  362. strcpy(sBuffer, _pbuffer + _pos);
  363. _pos += strlen(sBuffer) + 1;
  364. if(_pos > _length)
  365. {
  366. throw TC_PackOut_Exception("TC_PackOut read zero string error.");
  367. }
  368. return *this;
  369. }
  370. TC_PackOut& TC_PackOut::operator >> (string& sBuffer)
  371. {
  372. uint32_t len = 0;
  373. unsigned char c;
  374. (*this) >> c;
  375. if(c == 255)
  376. {
  377. (*this) >> len;
  378. }
  379. else
  380. {
  381. len = c;
  382. }
  383. if(_pos + len > _length)
  384. {
  385. throw TC_PackOut_Exception("TC_PackOut read string error.");
  386. }
  387. sBuffer.assign((const char*)(_pbuffer + _pos), len);
  388. _pos += len;
  389. return *this;
  390. }
  391. }