分类: php那些事 |
二、网络字节顺序格式(NBO,Network
Byte Order)
http://my.csdn.net/uploads/201204/12/1334195402_8818.jpg
在Socket编程开发中,通过函数inet_addr和inet_ntoa可以实现点分字符串与网络字节顺序格式IP地址之间的转换。
-
unsigned
long inet_addr(const char FAR * cp)
-
-
- #include
- #include
- #include
- #include
- #include
- #include
- #include
-
#define
MAXLINE 4096 -
-
int
main(int argc, char** argv) - {
-
int sockfd, n,rec_len; -
char recvline[4096], sendline[4096]; -
char buf[MAXLINE]; -
struct sockaddr_in servaddr; -
-
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ -
printf("create socket ,error: %s(errno: %d)\n" strerror(errno),errno); -
exit(0); -
} -
-
memset(&servaddr, 0, sizeof(servaddr)); -
servaddr.sin_family = AF_INET; -
servaddr.sin_port = htons(8000); -
//可以使用:inet_pton(AF_INET, "127.0.0.1", servaddr.sin_addr); -
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");//将字符串形式的IP地址转换为按网络字节顺序的整形值 -
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) ; -
printf("send msg );to server: \n" -
fgets(sendline, 4096, stdin); -
send(sockfd, sendline, strlen(sendline)); -
irec_len = recv(sockfd, buf, MAXLINE,0); -
-
buf[rec_len] = '\0'; -
printf("Received : ,buf);%s " -
close(sockfd); - }
三、主机字节顺序格式(HBO,Host
Byte Order)
-
int
GetIPCount(char * ip1,char * ip2) { -
long pp;; -
long ss;; -
-
pp = ntohl(inet_addr(ip1));; -
ss = ntohl(inet_addr(ip2));; -
-
return(ss - pp + 1);; - }
即可,具体实现如下:
-
char
* GetNextIp(char * m_curip) { -
struct sockaddr_in in;; -
long pp;; -
char * re;; -
-
pp = ntohl(inet_addr(m_curip));; -
pp = pp + 1;; -
-
in.sin_addr.s_addr = htonl(pp);; -
re = inet_ntoa(in.sin_addr);; -
-
return (re);; -
}
字节序相关知识
名词: 最低有效位(the
least significant bit,lsb):是指一个二进制数字中的第0位(即最低位),具有权值为2^0,可以用它来检测数的奇偶性。与之相反的称之为最高有效位。在大端序中,lsb指最右边的位。 最高有效位(the Most Significant Bit,msb):是指一个n位二进制数字中的n-1位,具有最高的权值http://upload.wikimedia.org/wikipedia/zh/math/4/2/e/42ef218254478d61d6f2afb986f4b88c.png。与之相反的称之为最低有效位。在大端序中,msb即指最左端的位。 |
单字节(abyte):大部分处理器以相同的顺序处理位元(bit),因此单字节的存放方法和传输方式一般相同。 多字节:如整数(32位机中一般占4字节),多字节对象被存储为连续的字节序列,数据的内存地址则是该内存地址的最小地址。
如long型数据的地址是ox001, 在不同的处理器的存放多字节数据的方式主要有两种: 大端序(英文名称为big
endian):指从最高位起存,位数最大的数字在最前,即高字节存于内存低地址,低字节存于内存高地址, 小端序(英文名称为little endian):指从对低位起存,位数最小的数字在最前。 即低字节存于内存低地址,高字节存于内存高地址,从最低有效字节到最高有效字节的顺序存储对象。 简单打个比方说,十进制数12345。1的位数最高,是万位;5的位数最低,是个位。 大端序的话,就是从万位开始存,表示为12345; 再如一个long型数据0x12345678的存储表示: 大端序存储表示:
小端序的存储表示:
|
2)网络序
网络传输一般采用大端序,也被称之为网络字节序,或网络序。IP协议中定义大端序为网络字节序。
socketAPI定义了一组转换函数,用于16和32bit整数在网络序和本机字节序之间的转换。htonl,htons用于本机序转换到网络序;ntohl,ntohs用于网络序转换到本机序。
3)位序
一般用于描述串行设备的传输顺序。一般硬件传输采用小端序(先传低位),但I2C协议采用大端序。网络协议中只有数据链路层的底端会涉及到。
4)处理器体系
5) 编程判断大端序和小端序
-
#include
-
-
bool
IsBigEndian(long a) - {
-
if(((char *)&a)[3] == 1) -
return true ; -
else -
return false ; - }
-
-
void
main(){ -
bool b ; -
long a = 0x12345678; -
b = IsBigEndian(a ); -
printf("%d", &a); - }
设定断点:
http://my.csdn.net/uploads/201204/12/1334201861_4628.jpg
打开
debug——>window——>Memory
http://my.csdn.net/uploads/201204/12/1334201913_8540.jpg
查看变量a 的地址:0x002BFE50
http://my.csdn.net/uploads/201204/12/1334202488_7434.jpg
查看内存地址:
http://my.csdn.net/uploads/201204/12/1334202045_1320.jpg
从上面看出我使用的x86
从而验证 b =false是正确的。
原文地址:http://blog.csdn.net/hguisu/article/details/7449955