endian.hh

Go to the documentation of this file.
00001 #ifndef ENDIAN_HH
00002 #define ENDIAN_HH
00003 
00004 #include <stdio.h>
00005 #include "assert.h"
00006 
00008 namespace endian {
00009 
00012   inline bool is_big_endian()
00013   {
00014     union {
00015       short i;
00016       unsigned char buf[2];
00017     } u;
00018     u.i = 0xbeaf;
00019     if (u.buf[0] == 0xbe) {
00020       assert(u.buf[1] == 0xaf);
00021       return true;
00022     }
00023     else if (u.buf[0] == 0xaf) {
00024       assert(u.buf[1] == 0xbe);
00025       return false;
00026     }
00027     assert(false);
00028   }
00029 
00030 
00032   static const bool big = is_big_endian();
00033 
00035   template <typename T>
00036   size_t write8(T v, FILE *file, bool write_big = false)
00037   {
00038     assert(sizeof(v) == 8);
00039     if (big == write_big)
00040       return fwrite(&v, 8, 1, file);
00041 
00042     char *ptr = (char*)(&v);
00043     char little[8];
00044     little[0] = ptr[7];
00045     little[1] = ptr[6];
00046     little[2] = ptr[5];
00047     little[3] = ptr[4];
00048     little[4] = ptr[3];
00049     little[5] = ptr[2];
00050     little[6] = ptr[1];
00051     little[7] = ptr[0];
00052     return fwrite(little, 8, 1, file);
00053   }
00054 
00056   template <typename T>
00057   size_t read8(T *buf, FILE *file, bool read_big = false)
00058   {
00059     if (big == read_big)
00060       return fread(buf, 8, 1, file);
00061 
00062     char *ptr = (char*)buf;
00063     char little[8];
00064     size_t ret = fread(little, 8, 1, file);
00065     ptr[0] = little[7];
00066     ptr[1] = little[6];
00067     ptr[2] = little[5];
00068     ptr[3] = little[4];
00069     ptr[4] = little[3];
00070     ptr[5] = little[2];
00071     ptr[6] = little[1];
00072     ptr[7] = little[0];
00073     return ret;
00074   }
00075   
00077   template <typename T>
00078   size_t write4(T v, FILE *file, bool write_big = false)
00079   {
00080     assert(sizeof(v) == 4);
00081     if (big == write_big)
00082       return fwrite(&v, 4, 1, file);
00083 
00084     char *ptr = (char*)(&v);
00085     char little[4];
00086     little[0] = ptr[3];
00087     little[1] = ptr[2];
00088     little[2] = ptr[1];
00089     little[3] = ptr[0];
00090     return fwrite(little, 4, 1, file);
00091   }
00092 
00094   template <typename T>
00095   size_t read4(T *buf, FILE *file, bool read_big = false)
00096   {
00097     if (big == read_big)
00098       return fread(buf, 4, 1, file);
00099 
00100     char *ptr = (char*)buf;
00101     char little[4];
00102     size_t ret = fread(little, 4, 1, file);
00103     ptr[0] = little[3];
00104     ptr[1] = little[2];
00105     ptr[2] = little[1];
00106     ptr[3] = little[0];
00107     return ret;
00108   }
00109 
00111   template <typename T>
00112   size_t write2(T v, FILE *file, bool write_big = false)
00113   {
00114     assert(sizeof(v) == 2);
00115     if (big == write_big)
00116       return fwrite(&v, 2, 1, file);
00117 
00118     char *ptr = (char*)(&v);
00119     char little[4];
00120     little[0] = ptr[0];
00121     little[1] = ptr[1];
00122     return fwrite(little, 2, 1, file);
00123   }
00124 
00126   template <typename T>
00127   size_t read2(T *buf, FILE *file, bool read_big = false)
00128   {
00129     if (big == read_big)
00130       return fread(buf, 2, 1, file);
00131 
00132     char *ptr = (char*)buf;
00133     char little[4];
00134     size_t ret = fread(little, 2, 1, file);
00135     ptr[0] = little[0];
00136     ptr[1] = little[1];
00137     return ret;
00138   }
00139 
00140 };
00141 
00142 #endif /* ENDIAN_HH */

Generated on Mon Jan 8 15:51:03 2007 for bit by  doxygen 1.4.6