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