判斷主機、網絡字節序和互相轉換
阿新 • • 發佈:2018-01-25
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(){ unsignedlong 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
判斷主機、網絡字節序和互相轉換