Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Byteswap

By: a guest on Jan 27th, 2013  |  syntax: C  |  size: 2.25 KB  |  views: 30  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. int byteswap(const char* filename){
  2.     int ERROR = 1;
  3.     FILE* f = NULL;
  4.     unsigned long recordsize = 2;
  5.     uint8_t* buf = NULL;
  6.     size_t buffersize = 0;
  7.     size_t buffersize_min = 8192;
  8.     //
  9.     // Figure out how big the buffer should be
  10.     //
  11.     buffersize = ((size_t)(recordsize));
  12.     std::cout << buffersize;
  13.     if(buffersize < buffersize_min) {
  14.         buffersize = buffersize_min - (buffersize_min % ((size_t)(recordsize)));
  15.     }
  16.  
  17.     //
  18.     // Allocate buffer
  19.     //
  20.     //buf = static_cast<uint8_t *>(malloc(buffersize)); //That's a C++ Fix
  21.     buf = malloc(buffersize); //C code
  22.     if(!buf) {
  23.         printf("Error: Out of memoryn");
  24.         return ERROR;
  25.     }
  26.  
  27.     f = fopen(filename, "r+b");
  28.     if(!f) { return ERROR; }
  29.  
  30.     for(;;) {
  31.         size_t rec;
  32.         size_t size;
  33.         //
  34.         // Read
  35.         //
  36.         clearerr(f);
  37.         size = fread(buf, 1, buffersize, f);
  38.         if(size == 0) {
  39.             // Check for error
  40.             if(ferror(f)) {
  41.                 return ERROR;
  42.             }
  43.             // Otherwise, done
  44.             break;
  45.         }
  46.         //
  47.         // Seek backwards
  48.         //
  49.         if(fseek(f, -((off_t)size), SEEK_CUR) != 0) {
  50.             return ERROR;
  51.         }
  52.  
  53.         if(size > buffersize) { size = buffersize; }
  54.         if(size < buffersize) {
  55.             //
  56.             // Round up to the next record, filling with zeroes as we go
  57.             //
  58.             size_t extra = size % recordsize;
  59.             if(extra) {
  60.                 for(; extra < recordsize; extra++) {
  61.                     buf[size++] = 0;
  62.                 }
  63.             }
  64.         }
  65.         //
  66.         // Reverse each record in memory
  67.         //
  68.         for(rec = 0; rec < size; rec += recordsize) {
  69.             size_t a = rec;
  70.             size_t b = rec + recordsize - 1;
  71.             for(; a < b; a++, b--) {
  72.                 uint8_t t = buf[a];
  73.                 buf[a] = buf[b];
  74.                 buf[b] =  t;
  75.             }
  76.         }
  77.         //
  78.         // Write
  79.         //
  80.         if(fwrite(buf, 1, size, f) != size) {
  81.             return ERROR;
  82.         }
  83.         fflush(f);
  84.     }
  85.     printf("%s: Donen", filename);
  86.  
  87.     if(f != NULL) {
  88.         fclose(f);
  89.     }
  90.     return 0;
  91. }