BinaryStream.cpp 1.8 KB

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