From Soiled Penguin, 7 Months ago, written in C++.
Embed
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <limits>
  6. #include <string>
  7. #include <sstream>
  8. #include <iomanip>
  9. #include <mutex>
  10.  
  11. #include "TeslaDeserializer.h"
  12.  
  13. using namespace std;
  14.  
  15. typedef unsigned char float_byte_array[sizeof(float)];
  16.  
  17. void Print_Bytes( float_byte_array thebytes )
  18. {
  19.         int i = 0;
  20.         for (i = 0; i < sizeof(float); i++ )
  21.         {
  22.                 if( int((unsigned)thebytes[i])!=0 )
  23.                         cout << uppercase << hex << (unsigned)thebytes[i] << " ";
  24.                 else
  25.                         cout << "00" << " ";
  26.         }
  27. }
  28.  
  29. void hexDump (const char *desc, const void *addr, const int len) {
  30.     int i;
  31.     unsigned char buff[17];
  32.     const unsigned char *pc = (const unsigned char*)addr;
  33.  
  34.     // Output description if given.
  35.     if (desc != NULL)
  36.         printf ("%s:\n", desc);
  37.  
  38.     if (len == 0) {
  39.         printf("  ZERO LENGTH\n");
  40.         return;
  41.     }
  42.     if (len < 0) {
  43.         printf("  NEGATIVE LENGTH: %i\n",len);
  44.         return;
  45.     }
  46.  
  47.     // Process every byte in the data.
  48.     for (i = 0; i < len; i++) {
  49.         // Multiple of 16 means new line (with line offset).
  50.  
  51.         if ((i % 16) == 0) {
  52.             // Just don't print ASCII for the zeroth line.
  53.             if (i != 0)
  54.                 printf ("  %s\n", buff);
  55.  
  56.             // Output the offset.
  57.             printf ("  %04x ", i);
  58.         }
  59.  
  60.         // Now the hex code for the specific character.
  61.         printf (" %02x", pc[i]);
  62.  
  63.         // And store a printable ASCII character for later.
  64.         if ((pc[i] < 0x20) || (pc[i] > 0x7e))
  65.             buff[i % 16] = '.';
  66.         else
  67.             buff[i % 16] = pc[i];
  68.         buff[(i % 16) + 1] = '\0';
  69.     }
  70.  
  71.     // Pad out last line if not exactly 16 characters.
  72.     while ((i % 16) != 0) {
  73.         printf ("   ");
  74.         i++;
  75.     }
  76.  
  77.     // And print the final ASCII bit.
  78.     printf ("  %s\n", buff);
  79. }
  80.  
  81. inline uint32_t SwapEndianess(uint32_t v)
  82. {
  83.         return (v >> 24) | ((v >> 8) & 0xff00) | ((v << 8) & 0xff0000) | (v << 24);
  84. }
  85.  
  86. int main()
  87. {
  88.         auto f = fopen("vision_detections", "rb");
  89.         if (!f)
  90.         {
  91.                 printf("Cannot open file\n");
  92.                 return false;
  93.         }
  94.  
  95.         bool result = true;
  96.         size_t bufferSize = 1024 * 100;
  97.         uint8_t* buffer = new uint8_t[bufferSize];
  98.  
  99.         for (;;)
  100.         {
  101.                 uint32_t size;
  102.                 if (1 != fread(&size, sizeof(size), 1, f))
  103.                         break;
  104.  
  105.                 size = SwapEndianess(size);
  106.                 if (size > (20 * 1024 * 1024))
  107.                 {
  108.                         fprintf(stderr, "Invalid size value in source file.");
  109.                         result = false;
  110.                         break;
  111.                 }
  112.  
  113.                 if (bufferSize < size)
  114.                 {
  115.                         delete buffer;
  116.                         bufferSize = size;
  117.                         buffer = new uint8_t[bufferSize];
  118.                 }
  119.  
  120.                 if (1 != fread(buffer, size, 1, f))
  121.                 {
  122.                         fprintf(stderr, "Unable to read item from source file.");
  123.                         result = false;
  124.                         break;
  125.                 }
  126.  
  127.  
  128.  
  129.                 try
  130.                 {
  131.  
  132.                         TeslaStructReader rd(buffer, size);
  133.  
  134.                         printf("\n\nDUMPING THE PROTO BUFFER\n\n");
  135.                         // Hex dump here
  136.  
  137.                         Print_Bytes(unsigned char rd);
  138.                         printf("\n\nEND OF DUMP\n\n");
  139.  
  140.  
  141.  
  142.                         //auto time = rd.GetTimestamp(0);
  143.                 }
  144.                 catch (const exception& ex)
  145.                 {
  146.                         fprintf(stderr, "Error while reading source item: %s.", ex.what());
  147.                         result = false;
  148.                         break;
  149.                 }
  150.         }
  151.  
  152.         fclose(f);
  153.         delete buffer;
  154.  
  155.         return result;
  156. }