字节排序函数
考虑一个16bit的整数,它由2个字节组成。内存中存储这两个字节有两种方法:一种是将低序字节存储在起始位置,这种称为小端(little-endian)字节序,另一种是将高序字节存储在起始地址,这称为大端(bin-endian)字节序。MSB(最高有效位):16位数的最左一位。LSB(最低有效位):最右一位。
查看主机的字节序:
#include<stdio.h>
#include<stdlib.h>
int main()
{
union
{
short s;
char c[sizeof(s)];
}un;
un.s=0x0102;
if(sizeof(short)==2)
{
if(un.c[0]==1&&un.c[1]==2)
printf("big-endian\n");
else if(un.c[0]==2&&un.c[1]==1)
printf("little-endian");
else
printf("unknown\n");
}
else
printf("szieof(short)=%d\n",sizeof(short));
exit(0);
}
网络字节序采用大端字节序,以下函数实现网络字节序与主机字节序的转换:#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
字节操纵函数:
源自4.3bsd套接字提供:
void bzero(void *s, size_t n);
void bcopy(const void *src, void *dest, size_t n);
int bcmp(const void *s1, const void *s2, size_t n);
源自ANSC C提供:
void *memset(void *s, int c, size_t n);
void *memcpy(void *dest, const void *src, size_t n);
int memcmp(const void *s1, const void *s2, size_t n);