Grid3
Endian.h
Go to the documentation of this file.
1 
2 #ifndef ENDIAN_H
3 #define ENDIAN_H
4 
5 #include <iostream>
6 
7 //Is this architecture little endian?
8 inline
10  long l=1;
11  return ((*(char*)&l));
12 }
13 
14 //Is this architecture big endian?
15 inline
16 bool IsBigEndian(){
17  return !IsLittleEndian();
18 }
19 
20 //Old, incorrect implementation.
21 /*inline
22 void ByteSwap(char* b, int n){
23  int i=0;
24  int j=n-1;
25  while(i,j){
26  std::swap(b[i],b[j]);
27  i++; j--;
28  }
29 }*/
30 
31 inline
32 void ByteSwap(char* b, int n){
33  for (int i = 0; i < n/2; i++) {
34  std::swap(b[i], b[n-1-i]);
35  }
36 }
37 
38 inline
39 void ReadFromBigEndian(char* ptr, int nelem, int bytesPerElem, std::istream &is){
40  is.read(ptr, nelem*bytesPerElem);
41  if(IsLittleEndian()){
42  //Swap byte order
43  for(int i= 0; i<nelem*bytesPerElem; i+=bytesPerElem){
44  ByteSwap(&ptr[i],bytesPerElem);
45  }
46  }
47 }
48 
49 inline
50 void WriteToBigEndian(char* ptr, int nelem, int bytesPerElem, std::ostream &os){
51  if(IsBigEndian()){
52  os.write(ptr, nelem*bytesPerElem);
53  }
54  else{
55  //Swap byte order
56  for(int i= 0; i<nelem*bytesPerElem; i+=bytesPerElem){
57  ByteSwap(&ptr[i],bytesPerElem);
58  }
59 
60  os.write(ptr, nelem*bytesPerElem);
61 
62  //Restore byte order
63  for(int i= 0; i<nelem*bytesPerElem; i+=bytesPerElem){
64  ByteSwap(&ptr[i],bytesPerElem);
65  }
66  }
67 }
68 
69 inline
70 void ReadFromLittleEndian(char* ptr, int nelem, int bytesPerElem, std::istream &is){
71  is.read(ptr, nelem*bytesPerElem);
72  if(IsBigEndian()){
73  //Swap byte order
74  for(int i= 0; i<nelem*bytesPerElem; i+=bytesPerElem){
75  ByteSwap(&ptr[i],bytesPerElem);
76  }
77  }
78 }
79 
80 inline
81 void WriteToLittleEndian(char* ptr, int nelem, int bytesPerElem, std::ostream &os){
82  if(IsLittleEndian()){
83  os.write(ptr, nelem*bytesPerElem);
84  }
85  else{
86  //Swap byte order
87  for(int i= 0; i<nelem*bytesPerElem; i+=bytesPerElem){
88  ByteSwap(&ptr[i],bytesPerElem);
89  }
90 
91  os.write(ptr, nelem*bytesPerElem);
92 
93  //Restore byte order
94  for(int i= 0; i<nelem*bytesPerElem; i+=bytesPerElem){
95  ByteSwap(&ptr[i],bytesPerElem);
96  }
97  }
98 }
99 
100 
101 
102 #endif
void ReadFromLittleEndian(char *ptr, int nelem, int bytesPerElem, std::istream &is)
Definition: Endian.h:70
void ReadFromBigEndian(char *ptr, int nelem, int bytesPerElem, std::istream &is)
Definition: Endian.h:39
bool IsLittleEndian()
Definition: Endian.h:9
void ByteSwap(char *b, int n)
Definition: Endian.h:32
bool IsBigEndian()
Definition: Endian.h:16
void WriteToBigEndian(char *ptr, int nelem, int bytesPerElem, std::ostream &os)
Definition: Endian.h:50
void WriteToLittleEndian(char *ptr, int nelem, int bytesPerElem, std::ostream &os)
Definition: Endian.h:81