1. 程式人生 > >判斷主機、網絡字節序和互相轉換

判斷主機、網絡字節序和互相轉換

9.1 判斷 gpo 位數 signed 轉換 pad bsp amp

大端字節序(big-endian):按照內存地址的增長方向,高位數據儲存於低位地址。

小端字節序(little-endian):按照內存地址增長方向,高位數據儲存於高位地址。

判斷主機、網絡字節序:

#include <stdio.h>
#include <arpa/inet.h> int main(void) {   unsigned short int h = 0x1234;   unsigned short int n;
  
if (*((unsigned char *)&h) == 0x12) {     printf("big-endian\n");   }   
if (*((unsigned char *)&h) == 0x34) {     printf("little-endian\n");   }
  n = htons(h);
  if (*((unsigned char *)&n) == 0x12) {
    printf("big-endian\n");
  } else {
    printf("little-endian\n");
  } 
  
return 0; }

或者:

#include <stdio.h>  
#include <arpa/inet.h>  
  
int main(){  
    unsigned 
long a = 0x12345678; unsigned char *p = (unsigned char *)(&a); printf("主機字節序:%0x %0x %0x %0x\n", p[0], p[1], p[2], p[3]); unsigned long b = htonl(a); //將主機字節序轉化成了網絡字節序 p = (unsigned char *)(&b); printf("網絡字節序:%0x %0x %0x %0x\n", p[0], p[1
], p[2], p[3]);
  return 0; }
結果:
  主機字節序:78 56 34 12
  網絡字節序:12 34 56 78

轉化:

include <stdio.h>  
#include <arpa/inet.h>  

int main()  
{  
    struct in_addr ipaddr;  
    unsigned long addr = inet_addr("192.168.1.100");  
    printf("addr = %u\n", ntohl(addr));  

    ipaddr.s_addr = addr;  
    printf("%s\n", inet_ntoa(ipaddr));    
    return 0;    
} 
結果:
  addr = 3232235876
  129.168.1.100

參考:http://blog.csdn.net/msdnwolaile/article/details/50727653

主機字節序與網絡字節序的轉換函數:htonl、ntohl、htons、ntohs 網址:http://blog.csdn.net/kulala082/article/details/53431473

判斷主機、網絡字節序和互相轉換