BinaryStream.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include <cstring>
  2. #include <boost/lexical_cast.hpp>
  3. #include "BinaryStream.h"
  4. //==============================================================================
  5. // read32bitNumber =
  6. //==============================================================================
  7. template<typename Type>
  8. Type BinaryStream::read32bitNumber()
  9. {
  10. // Read data
  11. uchar c[4];
  12. read((char*)c, sizeof(c));
  13. if(fail())
  14. {
  15. throw EXCEPTION("Failed to read stream");
  16. }
  17. // Copy it
  18. ByteOrder mbo = getMachineByteOrder();
  19. Type out;
  20. if(mbo == byteOrder)
  21. {
  22. memcpy(&out, c, 4);
  23. }
  24. else if(mbo == BO_BIG_ENDIAN && byteOrder == BO_LITTLE_ENDIAN)
  25. {
  26. out = (c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24));
  27. }
  28. else
  29. {
  30. out = ((c[0] << 24) | (c[1] << 16) | (c[2] << 8) | c[3]);
  31. }
  32. return out;
  33. }
  34. //==============================================================================
  35. // readUint =
  36. //==============================================================================
  37. uint BinaryStream::readUint()
  38. {
  39. return read32bitNumber<uint>();
  40. }
  41. //==============================================================================
  42. // readFloat =
  43. //==============================================================================
  44. float BinaryStream::readFloat()
  45. {
  46. return read32bitNumber<float>();
  47. }
  48. //==============================================================================
  49. // readString =
  50. //==============================================================================
  51. std::string BinaryStream::readString()
  52. {
  53. uint size;
  54. try
  55. {
  56. size = readUint();
  57. }
  58. catch(Exception& e)
  59. {
  60. throw EXCEPTION("Failed to read size");
  61. }
  62. const uint buffSize = 1024;
  63. if((size + 1) > buffSize)
  64. {
  65. throw EXCEPTION("String bigger than temp buffer");
  66. }
  67. char buff[buffSize];
  68. read(buff, size);
  69. if(fail())
  70. {
  71. throw EXCEPTION("Failed to read " +
  72. boost::lexical_cast<std::string>(size) + " bytes");
  73. }
  74. buff[size] = '\0';
  75. return std::string(buff);
  76. }
  77. //==============================================================================
  78. // getMachineByteOrder =
  79. //==============================================================================
  80. BinaryStream::ByteOrder BinaryStream::getMachineByteOrder()
  81. {
  82. int num = 1;
  83. if(*(char*)&num == 1)
  84. {
  85. return BO_LITTLE_ENDIAN;
  86. }
  87. else
  88. {
  89. return BO_BIG_ENDIAN;
  90. }
  91. }