53 #if BYTE_ORDER == LITTLE_ENDIAN
54 const bool BinexData::nativeLittleEndian =
true;
56 const bool BinexData::nativeLittleEndian =
false;
59 const BinexData::RecordID BinexData::INVALID_RECORD_ID = 0xFFFFFFFF;
60 const BinexData::SyncByte BinexData::DEFAULT_RECORD_FLAGS = 0x20;
61 const BinexData::SyncByte BinexData::VALID_RECORD_FLAGS = 0x38;
63 const unsigned long BinexData::UBNXI::MIN_VALUE = 0;
64 const unsigned long BinexData::UBNXI::MAX_VALUE = 536870911;
65 const unsigned char BinexData::UBNXI::MAX_BYTES = 4;
67 const long long BinexData::MGFZI::MIN_VALUE = -1157442765409226759LL;
68 const long long BinexData::MGFZI::MAX_VALUE = 1157442765409226759LL;
69 const unsigned char BinexData::MGFZI::MAX_BYTES = 8;
77 BinexData::UBNXI::UBNXI()
84 BinexData::UBNXI::UBNXI(
unsigned long ul)
94 else if (ul < 2097152)
98 else if (ul < 536870912)
107 std::ostringstream errStrm;
108 errStrm <<
"BINEX UBNXI overflow: " << ul;
109 FFStreamError
err(errStrm.str() );
119 BinexData::UBNXI::decode(
120 const std::string& inBuffer,
124 if (offset > inBuffer.size() )
126 std::ostringstream errStrm;
127 errStrm <<
"Invalid offset into BINEX UBNXI input buffer: " << offset;
128 FFStreamError
err(errStrm.str() );
132 for (size = 0, value = 0L; (size < MAX_BYTES) && more; size++)
134 unsigned char mask = (size < 3) ? 0x7f : 0xff;
137 value |= ( (
unsigned long)inBuffer[offset + size] & mask) << (7 * size);
141 value <<= (size < 3) ? 7 : 8;
142 value |= ( (
unsigned long)inBuffer[offset + size] & mask);
144 if ( (inBuffer[offset + size] & 0x80) != 0x80)
155 BinexData::UBNXI::encode(
156 std::string& outBuffer,
158 bool littleEndian)
const
162 uint32_t ul, ul1, ul2, ul3;
164 if (offset > outBuffer.size() )
166 std::ostringstream errStrm;
167 errStrm <<
"Invalid offset into BINEX UBNXI output buffer: " << offset;
168 FFStreamError
err(errStrm.str() );
175 outBuffer.replace(offset, size,
reinterpret_cast<char*
>(&uc), size);
179 us = (uint16_t)value;
180 us1 = 0x7f00 & (us << 1);
184 if (littleEndian != nativeLittleEndian)
189 us |= nativeLittleEndian ? 0x0080 : 0x8000;
191 outBuffer.replace(offset, size,
reinterpret_cast<char*
>(&us), size);
195 ul = (uint32_t)value;
196 ul2 = 0x007f0000 & (ul << 2);
197 ul1 = 0x00007f00 & (ul << 1);
201 if (littleEndian != nativeLittleEndian)
207 if (nativeLittleEndian)
217 outBuffer.replace(offset, size,
reinterpret_cast<char*
>(&ul), size);
223 ul = (uint32_t)value;
224 ul3 = 0xff000000 & (ul << 3);
225 ul2 = 0x007f0000 & (ul << 2);
226 ul1 = 0x00007f00 & (ul << 1);
228 ul |= ul1 | ul2 | ul3;
230 if (!nativeLittleEndian)
238 ul = (uint32_t)value;
239 ul2 = 0x7f000000 & (ul << 2);
240 ul1 = 0x007f0000 & (ul << 1);
244 if (nativeLittleEndian)
250 ul |= nativeLittleEndian ? 0x00808080 : 0x80808000;
252 outBuffer.replace(offset, size,
reinterpret_cast<char*
>(&ul), size);
256 std::ostringstream errStrm;
257 errStrm <<
"BINEX UBNXI invalid size: " << size;
258 FFStreamError
err(errStrm.str() );
268 BinexData::UBNXI::read(
270 std::string *outBuffer,
275 unsigned char mask = 0;
276 char buffer [MAX_BYTES];
285 for (size = 0, value = 0L; (size < MAX_BYTES) && more; size++)
287 mask = (size < 3) ? 0x7f : 0xff;
289 strm.read(&buffer[size], 1);
292 FFStreamError
err(
"Error reading BINEX UBNXI");
297 value |= ( (
unsigned long)buffer[size] & mask) << (size * 7);
301 value <<= (size < 3) ? 7 : 8;
302 value |= (
unsigned long)buffer[size] & mask;
304 if ( (buffer[size] & 0x80) != 0x80)
312 if (offset <= outBuffer->size() )
314 outBuffer->replace(offset, size, buffer, size);
318 std::ostringstream errStrm;
319 errStrm <<
"Invalid offset into BINEX UBNXI output buffer: " << offset;
320 FFStreamError
err(errStrm.str() );
331 BinexData::UBNXI::write(
333 std::string *outBuffer,
336 bool littleEndian)
const
339 encode(buffer, 0, littleEndian);
342 if (offset <= outBuffer->size() )
345 outBuffer->replace(offset, size, buffer);
349 std::ostringstream errStrm;
350 errStrm <<
"Invalid offset into BINEX UBNXI output buffer: " << offset;
351 FFStreamError
err(errStrm.str() );
357 reverseBuffer(buffer);
359 strm.write(buffer.data(), size);
362 FFStreamError
err(
"Error writing BINEX UBNXI");
373 BinexData::MGFZI::MGFZI()
381 BinexData::MGFZI::MGFZI(
long long ll)
384 long long absValue = llabs(ll);
390 else if (absValue < 4110LL)
394 else if (absValue < 1052685LL)
398 else if (absValue < 269488140LL)
402 else if (absValue < 68988964875LL)
406 else if (absValue < 17661175009290LL)
410 else if (absValue < 4521260802379785LL)
414 else if (absValue <= BinexData::MGFZI::MAX_VALUE)
423 std::ostringstream errStrm;
424 errStrm <<
"BINEX MGFZI overflow: " << ll;
425 FFStreamError
err(errStrm.str() );
433 BinexData::MGFZI::decode(
434 const std::string& inBuffer,
438 long long absValue = 0;
443 if (offset > inBuffer.size() )
445 std::ostringstream errStrm;
446 errStrm <<
"Invalid offset into BINEX MGFZI input buffer: " << offset;
447 FFStreamError
err(errStrm.str() );
451 if (inBuffer.size() == 0)
460 ? inBuffer[offset] & 0x0f
461 : (inBuffer[offset] >> 4) & 0x0f;
464 sign = (flags & 0x08) ? -1 : 1;
467 size = (flags & 0x07) + 1;
468 if (size > inBuffer.size() )
470 std::ostringstream errStrm;
471 errStrm <<
"BINEX MGFZI is too large for the supplied decode buffer: "
472 <<
"MGFZI size = " << size <<
" , buffer size = "
474 FFStreamError
err(errStrm.str() );
483 ull = parseBuffer(inBuffer, offset, 1);
484 absValue = littleEndian
486 : ull & 0x0000000fULL;
487 if (sign == -1 && absValue == 0)
495 value = sign * absValue;
502 ull = parseBuffer(inBuffer, offset, 2);
503 if (littleEndian != nativeLittleEndian)
508 absValue = littleEndian
510 : ull & 0x0000000000000fffULL;
511 value = sign * (14ULL + absValue);
517 ull = parseBuffer(inBuffer, offset, 3);
518 if (littleEndian != nativeLittleEndian)
523 absValue = littleEndian
525 : ull & 0x00000000000fffffULL;
526 value = sign * (4109ULL + absValue);
532 ull = parseBuffer(inBuffer, offset, 4);
533 if (littleEndian != nativeLittleEndian)
538 absValue = littleEndian
540 : ull & 0x000000000fffffffULL;
541 value = sign * (1052684ULL + absValue);
547 ull = parseBuffer(inBuffer, offset, 5);
548 if (littleEndian != nativeLittleEndian)
553 absValue = littleEndian
555 : ull & 0x0000000fffffffffULL;
556 value = sign * (269488139ULL + absValue);
562 ull = parseBuffer(inBuffer, offset, 6);
563 if (littleEndian != nativeLittleEndian)
568 absValue = littleEndian
570 : ull & 0x00000fffffffffffULL;
571 value = sign * (68988964874ULL + absValue);
577 ull = parseBuffer(inBuffer, offset, 7);
578 if (littleEndian != nativeLittleEndian)
583 absValue = littleEndian
585 : ull & 0x000fffffffffffffULL;
586 value = sign * (17661175009289ULL + absValue);
592 ull = parseBuffer(inBuffer, offset, 8);
593 if (littleEndian != nativeLittleEndian)
597 absValue = littleEndian
599 : ull & 0x0fffffffffffffffULL;
600 value = sign * (4521260802379784ULL + absValue);
605 std::ostringstream errStrm;
606 errStrm <<
"BINEX MGFZI invalid size: " << size;
607 FFStreamError
err(errStrm.str() );
619 BinexData::MGFZI::encode(
620 std::string& outBuffer,
622 bool littleEndian)
const
624 char buffer[MAX_BYTES];
630 if (offset > outBuffer.size() )
632 std::ostringstream errStrm;
633 errStrm <<
"Invalid offset into BINEX MGFZI output buffer: " << offset;
634 FFStreamError
err(errStrm.str() );
638 long long absValue = llabs(value);
639 unsigned char signBit = (value < 0) ? 0x01 : 0x00;
641 size_t result = size;
647 uc = (signBit << 7) | (0x0f & (
unsigned char)absValue);
651 uc = (signBit << 3) | (0xf0 & ( (
unsigned char)absValue << 4) );
665 us = ( (
unsigned short)signBit << 3)
666 | (0xfff1 & (0x0001 | (
unsigned short)absValue << 4) );
670 us = ((
unsigned short)signBit << 15)
671 | (0x1fff & (0x1000 | (
unsigned short)absValue) );
673 if (littleEndian != nativeLittleEndian)
677 memcpy((
void*)buffer, (
const void*)&us, 2);
684 ul = ((
unsigned long)signBit << 3)
685 | (0x00fffff2 & (0x00000002 | (
unsigned long)absValue << 4) );
689 ul = ((
unsigned long)signBit << 31)
690 | (0x2fffff00 & (0x20000000 | (
unsigned long)absValue << 8) );
692 if (littleEndian != nativeLittleEndian)
696 memcpy((
void*)buffer, (
const void*)&ul, 3);
700 absValue -= 1052684LL;
703 ul = ((
unsigned long)signBit << 3)
704 | (0xfffffff3 & (0x00000003 | (
unsigned long)absValue << 4) );
708 ul = ((
unsigned long)signBit << 31)
709 | (0x3fffffff & (0x30000000 | (
unsigned long)absValue) );
711 if (littleEndian != nativeLittleEndian)
715 memcpy((
void*)buffer, (
const void*)&ul, 4);
719 absValue -= 269488139LL;
722 ull = ((
unsigned long long)signBit << 3)
723 | (0x000000fffffffff4ULL & (0x0000000000000004ULL | (
unsigned long long)absValue << 4) );
727 ull = ((
unsigned long long)signBit << 63)
728 | (0x4fffffffff000000ULL & (0x4000000000000000ULL | (
unsigned long long)absValue << 24) );
730 if (littleEndian != nativeLittleEndian)
734 memcpy((
void*)buffer, (
const void*)&ull, 5);
738 absValue -= 68988964874LL;
741 ull = ((
unsigned long long)signBit << 3)
742 | (0x0000fffffffffff5ULL & (0x0000000000000005ULL | (
unsigned long long)absValue << 4) );
746 ull = ((
unsigned long long)signBit << 63)
747 | (0x5fffffffffff0000ULL & (0x5000000000000000ULL | (
unsigned long long)absValue << 16) );
749 if (littleEndian != nativeLittleEndian)
753 memcpy((
void*)buffer, (
const void*)&ull, 6);
757 absValue -= 17661175009289LL;
760 ull = ((
unsigned long long)signBit << 3)
761 | (0x00fffffffffffff6ULL & (0x0000000000000006ULL | (
unsigned long long)absValue << 4) );
765 ull = ((
unsigned long long)signBit << 63)
766 | (0x6fffffffffffff00ULL & (0x6000000000000000ULL | (
unsigned long long)absValue << 8) );
768 if (littleEndian != nativeLittleEndian)
772 memcpy((
void*)buffer, (
const void*)&ull, 7);
776 absValue -= 4521260802379784LL;
779 ull = ((
unsigned long long)signBit << 3)
780 | (0xfffffffffffffff7ULL & (0x0000000000000007ULL | (
unsigned long long)absValue << 4) );
784 ull = ((
unsigned long long)signBit << 63)
785 | (0x7fffffffffffffffULL & (0x7000000000000000ULL | (
unsigned long long)absValue) );
787 if (littleEndian != nativeLittleEndian)
791 memcpy((
void*)buffer, (
const void*)&ull, 8);
797 buffer[0] = (char)0x80;
800 outBuffer.replace(offset, size, buffer, size);
807 BinexData::MGFZI::read(
809 std::string *outBuffer,
814 std::string buffer(
" ");
818 strm.read((
char*)&buffer[0], 1);
823 : (buffer[0] >> 4) & 0x0f;
826 size = (flags & 0x07) + 1;
831 strm.read((
char*)&buffer[1], size - 1);
832 if (!strm.good() || ((size_t)strm.gcount() + 1 != size))
834 FFStreamError
err(
"Error reading BINEX MGFZI");
840 reverseBuffer(buffer);
845 if (offset <= outBuffer->size() )
847 outBuffer->replace(offset, size, buffer, 0, size);
851 std::ostringstream errStrm;
852 errStrm <<
"Invalid offset into BINEX MGFZI output buffer: "
854 FFStreamError
err(errStrm.str() );
860 std::string tmp((
const char*)&buffer[0], size);
861 decode(tmp, size, littleEndian);
869 BinexData::MGFZI::write(
871 std::string *outBuffer,
874 bool littleEndian)
const
877 encode(buffer, 0, littleEndian);
882 if (offset <= outBuffer->size() )
884 outBuffer->replace(offset, size, buffer);
888 std::ostringstream errStrm;
889 errStrm <<
"Invalid offset into BINEX MGFZI output buffer: " << offset;
890 FFStreamError
err(errStrm.str() );
896 reverseBuffer(buffer);
898 strm.write(buffer.data(), size);
901 FFStreamError
err(
"Error writing BINEX MGFZI");
913 BinexData::BinexData()
916 recID = INVALID_RECORD_ID;
932 setRecordFlags(recordFlags);
933 setRecordID(recordID);
950 return ( (recID == b.
recID)
952 && (msg.compare(b.
msg) == 0) );
960 if (
id > UBNXI::MAX_VALUE)
962 FFStreamError
err(
"BINEX record ID overflow");
977 syncByte = flags & VALID_RECORD_FLAGS;
981 syncByte |= (flags & eEnhancedCRC) ? 0xC0 : 0xC2;
989 BinexData::getRecordSize()
const
991 size_t headLen = getHeadLength();
992 size_t recSize = headLen + msg.size();
993 size_t crcLen = getCRCLength(recSize - 1);
997 if (syncByte & eReverseReadable)
999 UBNXI t(headLen + msg.size() + crcLen);
1012 BinexData::clearMessage()
1021 BinexData::ensureMessageCapacity(
size_t cap)
1023 if (cap > UBNXI::MAX_VALUE)
1025 std::ostringstream errStrm;
1026 errStrm <<
"Requested message length exceeds allowable maximum: " << cap;
1027 InvalidParameter ip(errStrm.str() );
1037 BinexData::getHeadLength()
const
1043 UBNXI m(msg.size() );
1051 BinexData::updateMessageData(
1055 bool littleEndian = ( (syncByte & eBigEndian) == 0) ? true :
false;
1056 ensureMessageCapacity(offset +
data.getSize() );
1057 offset +=
data.encode(msg, offset, littleEndian);
1064 BinexData::updateMessageData(
1068 bool littleEndian = ( (syncByte & eBigEndian) == 0) ? true :
false;
1069 ensureMessageCapacity(offset +
data.getSize() );
1070 offset +=
data.encode(msg, offset, littleEndian);
1077 BinexData::updateMessageData(
1079 const std::string&
data,
1082 ensureMessageCapacity(offset + size);
1083 if (size >
data.size() )
1085 std::ostringstream errStrm;
1086 errStrm <<
"Invalid data size: " << size;
1087 InvalidParameter ip(errStrm.str() );
1090 msg.replace(offset, size,
data, 0, size);
1098 BinexData::updateMessageData(
1103 ensureMessageCapacity(offset + size);
1104 msg.replace(offset, size,
data, size);
1111 BinexData::extractMessageData(
1115 if (offset > msg.size() )
1117 std::ostringstream errStrm;
1118 errStrm <<
"Message buffer offset invalid: " << offset;
1119 InvalidParameter ip(errStrm.str() );
1122 bool littleEndian = ( (syncByte & eBigEndian) == 0) ? true :
false;
1123 offset +=
data.decode(msg, offset, littleEndian);
1129 BinexData::extractMessageData(
1133 if (offset > msg.size() )
1135 std::ostringstream errStrm;
1136 errStrm <<
"Message buffer offset invalid: " << offset;
1137 InvalidParameter ip(errStrm.str() );
1140 bool littleEndian = ( (syncByte & eBigEndian) == 0) ? true :
false;
1141 offset +=
data.decode(msg, offset, littleEndian);
1147 BinexData::extractMessageData(
1152 if (offset + size > msg.size() )
1154 std::ostringstream errStrm;
1155 errStrm <<
"Message buffer offset invalid: " << offset;
1156 InvalidParameter ip(errStrm.str() );
1159 data.assign(msg, offset, size);
1170 FFStreamError e(
"Attempt to read a BinexData object"
1171 " from a non-BinexStream FFStream.");
1174 putRecord(
dynamic_cast<std::ostream&
>(ffs));
1179 BinexData::putRecord(std::ostream& strm)
const
1184 if (!isHeadSyncByteValid(syncByte, syncTail) )
1186 std::ostringstream errStrm;
1187 errStrm <<
"Invalid BINEX synchronization byte: "
1188 <<
static_cast<uint16_t
>(syncByte);
1189 FFStreamError
err(errStrm.str() );
1193 std::string headBuf;
1197 bool littleEndian = (syncByte&eBigEndian)==0 ?
true :
false;
1202 headBuf.append(1, syncByte);
1207 bufLen += r.
encode(headBuf, bufLen, littleEndian);
1210 UBNXI m(msg.size() );
1211 bufLen += m.
encode(headBuf, bufLen, littleEndian);
1214 strm.write(headBuf.data(), headBuf.size() );
1215 strm.write(msg.data(), msg.size() );
1218 std::string tailBuf;
1219 tailBuf.reserve(21);
1220 headBuf.erase(0, 1);
1221 getCRC(headBuf, msg, tailBuf);
1222 crcLen = tailBuf.size();
1225 if (syncByte & eReverseReadable)
1228 recLen.
encode(tailBuf, crcLen, littleEndian);
1229 reverseBuffer(tailBuf, crcLen);
1230 tailBuf.append(1, syncTail);
1234 strm.write(tailBuf.data(), tailBuf.size() );
1236 catch(std::exception& exc)
1238 FFStreamError
err(exc.what());
1243 FFStreamError
err(
"Unknown exception");
1247 if (strm.fail() || strm.bad())
1249 FFStreamError
err(
"Error writing data");
1259 FFStreamError e(
"Attempt to read a BinexData object"
1260 " from a non-BinexStream FFStream.");
1263 getRecord(
dynamic_cast<std::istream&
>(ffs));
1267 size_t BinexData::getRecord(std::istream& strm)
1272 size_t crcBufLen = 0;
1275 std::string expectedCrc;
1276 unsigned char crc [16];
1279 std::istream::pos_type stpos, endpos;
1283 stpos = endpos = strm.tellg();
1284 strm.read((
char*)&syncBuf, 1);
1286 catch (std::exception &e)
1288 if ( (strm.gcount() == 0) && strm.eof() )
1291 EndOfFile
err(
"EOF encountered");
1297 FFStreamError
err(e.what() );
1304 if (isHeadSyncByteValid(syncBuf, expectedSyncByte) )
1309 bool littleEndian = (syncByte & eBigEndian) == 0 ?
true :
false;
1312 crcBufLen += uRecID.
read(strm, &crcBuf, crcBufLen,
false, littleEndian);
1316 crcBufLen += uMsgLen.
read(strm, &crcBuf, crcBufLen,
false, littleEndian);
1318 unsigned long msgLen = (
unsigned long)uMsgLen;
1324 std::vector<char> msgBuf(msgLen);
1325 strm.read((
char*)&msgBuf[0], msgLen);
1326 if (!strm.good() || ((
unsigned long)strm.gcount() != msgLen) )
1328 FFStreamError
err(
"Incomplete BINEX record message");
1331 msg.assign((
char*)&msgBuf[0], msgLen);
1335 getCRC(crcBuf, msg, expectedCrc);
1336 crcLen = expectedCrc.size();
1338 strm.read( (
char*)crc, crcLen);
1339 if (!strm.good() || ((
size_t)strm.gcount() != crcLen) )
1341 FFStreamError
err(
"Error reading BINEX CRC");
1344 if (memcmp(crc, expectedCrc.data(), crcLen) )
1346 FFStreamError
err(
"Bad BINEX CRC");
1350 else if (isTailSyncByteValid(syncBuf, expectedSyncByte) )
1353 bool littleEndian = (expectedSyncByte & eBigEndian) == 0 ?
true :
false;
1356 b.
read(strm,
NULL, 0,
false, littleEndian);
1357 unsigned long revRecSize = (
unsigned long)b;
1360 std::vector<char> revRecVec(revRecSize);
1361 strm.read( (
char*)&revRecVec[0], revRecSize);
1362 if (!strm.good() || ((
unsigned long)strm.gcount() != revRecSize) )
1364 FFStreamError
err(
"Incomplete BINEX record message");
1367 std::string revRecBuf( (
char*)&revRecVec[0], revRecSize);
1368 reverseBuffer(revRecBuf, revRecSize);
1370 if (revRecBuf[0] != expectedSyncByte)
1372 FFStreamError
err(
"BINEX head/tail synchronization byte mismatch");
1375 syncByte = expectedSyncByte;
1378 offset += r.
decode(revRecBuf, offset, littleEndian);
1381 offset += m.
decode(revRecBuf, offset, littleEndian);
1384 msg.assign(revRecBuf, offset, (
unsigned long)m);
1385 offset += msg.size();
1388 getCRC(revRecBuf.substr(1, r.getSize() + m.getSize() ), msg, expectedCrc);
1389 crcLen = expectedCrc.size();
1391 if ( (offset + crcLen != revRecSize)
1392 || expectedCrc.compare(revRecBuf.substr(offset, crcLen) ) )
1394 FFStreamError
err(
"Bad BINEX CRC");
1400 std::ostringstream errStrm;
1401 errStrm <<
"Invalid BINEX synchronization byte: "
1402 <<
static_cast<uint16_t
>(syncBuf);
1403 FFStreamError
err(errStrm.str() );
1407 endpos = strm.tellg();
1409 catch(FFStreamError& exc)
1413 catch(std::exception& exc)
1415 FFStreamError
err(exc.what() );
1420 FFStreamError
err(
"Unknown exception");
1424 return (endpos-stpos);
1428 BinexData::getCRC(
const std::string& head,
1429 const std::string& message,
1430 std::string& crc)
const
1432 size_t crcDataLen = head.size() + message.size();
1434 unsigned long crcTmp = 0;
1436 if (crcDataLen >= 1048576)
1443 if (syncByte & eEnhancedCRC)
1445 if (crcDataLen < 128)
1474 if (crcDataLen < 128)
1480 for (b = head.size(); b > 0 ; b--, ptr++)
1484 ptr = message.data();
1485 for (b = message.size(); b > 0 ; b--, ptr++)
1491 else if (crcDataLen < 4096)
1520 crc.resize(
sizeof(crcTmp));
1530 BinexData::getCRCLength(
size_t crcDataLen)
const
1534 if (crcDataLen >= 1048576)
1540 if (syncByte & eEnhancedCRC)
1542 if (crcDataLen < 128)
1553 if (crcDataLen < 128)
1557 else if (crcDataLen < 4096)
1584 expectedTailSync = 0x00;
1588 expectedTailSync = 0xB4;
1592 expectedTailSync = 0xB0;
1596 expectedTailSync = 0xE4;
1600 expectedTailSync = 0xE0;
1617 expectedHeadSync = 0xD2;
1621 expectedHeadSync = 0xF2;
1625 expectedHeadSync = 0xD8;
1629 expectedHeadSync = 0xF8;
1640 BinexData::parseBuffer(
const std::string& buffer,
1644 unsigned long long value = 0;
1645 if (size >
sizeof(value) )
1647 FFStreamError
err(
"Invalid data size parsing BINEX data buffer");
1650 if (offset + size > buffer.size() )
1652 FFStreamError
err(
"Invalid offset parsing BINEX data buffer");
1655 char* valp = (
char*)&value;
1656 for (
size_t i = 0; i < size; i++, valp++)
1658 *valp = buffer[offset + i];
1660 if (!nativeLittleEndian)
1662 value >>= ( (
sizeof(value) - size) << 3);
1670 BinexData::reverseBytes(T& val)
1673 uint8_t *from((uint8_t*)(©)), *to((uint8_t*)(&val));
1674 for (
unsigned i = 0; i <
sizeof(T); i++)
1676 to[i] = from[
sizeof(T)-(i+1)];
1683 BinexData::reverseBuffer(std::string& buffer,
size_t offset,
size_t n)
1688 if (offset >= buffer.size() )
1690 FFStreamError
err(
"Invalid offset reversing BINEX data buffer");
1693 size_t back = (n == std::string::npos) ? buffer.size() - 1: offset + n;
1694 if (back >= buffer.size() )
1696 FFStreamError
err(
"Invalid size reversing BINEX data buffer");
1701 while (offset < back)
1703 tmp = buffer[offset];
1704 buffer[offset] = buffer[back];
1714 std::cout <<
"RecordID: " << recID << std::endl;
1715 std::cout <<
"SyncByte: " << (
unsigned short)syncByte << std::endl;
1716 std::cout <<
"MessageLen: " << msg.size() << std::endl;
1717 std::cout <<
"MessageData: " << std::endl;
1718 for (
size_t i = 0; i < msg.size(); i++)
1720 unsigned short s = msg[i];
1721 std::cout << s <<
" ";
1723 std::cout << std::endl;