30 Aralık 2016 Cuma

Sistemin Endian Tipini Anlamak

Örnek 1 - byte pointer
Şöyle yaparız. Little Endian da yazmaya soldan başlayacağımız için ilk byte'a 1 yazılır. char'a cast edince de ilk byte 1 olarak gelir.
bool IsLittleEndian(){

  int a = 1;

  char* ptr = (char*)&a;

  return *ptr;
}
Örnek 2  - byte pointer
Şöyle yaparız.
int i = 7;
char* p = reinterpret_cast<char*>(&i);
if(p[0] == '\x7')
  std::cout << "This system is little-endian\n";
else
  std::cout << "This system is big-endian\n";
Çalışma şekli şudur.
Big endian:

+-----+-----+-----+-----+
|  0  |  0  |  0  |  7  |
+-----+-----+-----+-----+
   ^ pointer to int points here

Little endian:

+-----+-----+-----+-----+
|  7  |  0  |  0  |  0  |
+-----+-----+-----+-----+
   ^ pointer to int points here
Örnek 3 - byte pointer
Ya da şöyle bulunabilir. Big Endian da yazmaya sağdan başladığımız için ilk byte'a 0x01 yazılır. char'a cast edince de ilk byte 1 olarak gelir.
long test = 0x01020304;
char* ptr = (char*)&test;
int isSystemBigEndian = (ptr[0] == 0x01);
Örnek 4 - htons
Şöyle yaparız
#include <stdio.h>
#include <arpa/inet.h>

int main(int argc, char *argv[]) {
  uint16_t num = 123;

  if (htons(num) == num) {
    printf("big endian\n");
  } else {
    printf("little endian\n");
  }
}
Örnek 5 - union
byte pointer yöntemine benziyor. Şöyle yaparız
#include <stdio.h>
#include <stdint.h>

union echeck {
  uint32_t i;
  char c[4];
} echeck = { .c = { 0x01, 0x02, 0x03, 0x04 } };

int main()
{
  if (echeck.i == 0x01020304) {
    printf("big endian\n");
  } else if (echeck.i == 0x04030201) {
    printf("little endian\n");
  } else if (echeck.i == 0x02010403) {
    printf("pdp endian\n");
  } else {
    printf("other endian\n");
  }
  return 0;
}

Hiç yorum yok:

Yorum Gönder