htonl ntohl htons ntohs 函数实现
2016-03-07 09:20
260 查看
typedef unsigned short int uint16;
typedef
unsigned long int uint32;
// 短整型大小端互换
#define BigLittleSwap16(A)
((((uint16)(A)
& 0xff00) >> 8) | \
(((uint16)(A)
& 0x00ff) << 8))
// 长整型大小端互换
#define BigLittleSwap32(A)
((((uint32)(A)
& 0xff000000) >> 24) | \
(((uint32)(A)
& 0x00ff0000) >> 8) | \
(((uint32)(A)
& 0x0000ff00) << 8) | \
(((uint32)(A)
& 0x000000ff) << 24))
// 本机大端返回1,小端返回0
int checkCPUendian()
{
union{
unsigned
long int i;
unsigned
char s[4];
}c;
c.i = 0x12345678;
return (0x12
== c.s[0]);
}
// 模拟htonl函数,本机字节序转网络字节序
unsigned long int t_htonl(unsigned
long int h)
{
// 若本机为大端,与网络字节序同,直接返回
// 若本机为小端,转换成大端再返回
return checkCPUendian()
? h : BigLittleSwap32(h);
}
// 模拟ntohl函数,网络字节序转本机字节序
unsigned long int t_ntohl(unsigned
long int n)
{
// 若本机为大端,与网络字节序同,直接返回
// 若本机为小端,网络数据转换成小端再返回
return checkCPUendian()
? n : BigLittleSwap32(n);
}
// 模拟htons函数,本机字节序转网络字节序
unsigned short int t_htons(unsigned
short int h)
{
// 若本机为大端,与网络字节序同,直接返回
// 若本机为小端,转换成大端再返回
return checkCPUendian()
? h : BigLittleSwap16(h);
}
// 模拟ntohs函数,网络字节序转本机字节序
unsigned short int t_ntohs(unsigned
short int n)
{
// 若本机为大端,与网络字节序同,直接返回
// 若本机为小端,网络数据转换成小端再返回
return checkCPUendian()
? n : BigLittleSwap16(n);
}
typedef
unsigned long int uint32;
// 短整型大小端互换
#define BigLittleSwap16(A)
((((uint16)(A)
& 0xff00) >> 8) | \
(((uint16)(A)
& 0x00ff) << 8))
// 长整型大小端互换
#define BigLittleSwap32(A)
((((uint32)(A)
& 0xff000000) >> 24) | \
(((uint32)(A)
& 0x00ff0000) >> 8) | \
(((uint32)(A)
& 0x0000ff00) << 8) | \
(((uint32)(A)
& 0x000000ff) << 24))
// 本机大端返回1,小端返回0
int checkCPUendian()
{
union{
unsigned
long int i;
unsigned
char s[4];
}c;
c.i = 0x12345678;
return (0x12
== c.s[0]);
}
// 模拟htonl函数,本机字节序转网络字节序
unsigned long int t_htonl(unsigned
long int h)
{
// 若本机为大端,与网络字节序同,直接返回
// 若本机为小端,转换成大端再返回
return checkCPUendian()
? h : BigLittleSwap32(h);
}
// 模拟ntohl函数,网络字节序转本机字节序
unsigned long int t_ntohl(unsigned
long int n)
{
// 若本机为大端,与网络字节序同,直接返回
// 若本机为小端,网络数据转换成小端再返回
return checkCPUendian()
? n : BigLittleSwap32(n);
}
// 模拟htons函数,本机字节序转网络字节序
unsigned short int t_htons(unsigned
short int h)
{
// 若本机为大端,与网络字节序同,直接返回
// 若本机为小端,转换成大端再返回
return checkCPUendian()
? h : BigLittleSwap16(h);
}
// 模拟ntohs函数,网络字节序转本机字节序
unsigned short int t_ntohs(unsigned
short int n)
{
// 若本机为大端,与网络字节序同,直接返回
// 若本机为小端,网络数据转换成小端再返回
return checkCPUendian()
? n : BigLittleSwap16(n);
}
相关文章推荐
- Oracle 如何修改表名, Oracle 如何修改列名 ,Oracle 如何修改字段类型语句
- 设置MySQL开机自动启动的方法
- HTML+CSS D07 边框、div
- 使用Java构造和解析Json数据的两种方法(详解一)
- 过滤器
- 模拟器cmd指令
- 代码重构(二):类重构规则
- RecyclerView重用导致的元素重复问题
- idea设置todo快捷键
- “新ICT”时代,商业与科技共同进化
- C语言实现使用动态数组实现循环队列
- 改变心态:让技术安全工作不再枯燥
- 课程进度总结
- Linux环境变量PS1_命令行提示符设置
- 用yum来安装jenkins
- poj 2479 Maximum sum 最大数字连续和
- 日经春秋 20160307
- 天声人語 20160307 命ひしめく春に
- 下载文件到指定文件夹
- 管理win2012文件服务器-笔记