网络字节序与主机字节序的转换函数实践

首先我们要对于网络字节序和主机字节序有一个初步的概念。

字节序:字节在内存中储存的顺序

字节序的种类:(1):大端字节序,数值高位储存在内存的低地址,低位储存在内存的高地址,在                           两个电脑之间传输时候用的

                        (2):小端字节序,数值低位储存在内存的低地址,高位储存在内存的高地址,在                            自己电脑上传输东西用的

主机字节序:CPU存储数据时采用的字节顺序,不同CPU采用的字节序是不同的。

网络字节序:使用的统一字节顺序,避免兼容问题。

关于两者的相互转换,我们将在Linux里面进行

我们经常会使用以下四个C标准库函数进行字节的转换:

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);        //把uint32_t类型从主机序转换到网络序
uint16_t htons(uint16_t hostshort);        //把uint16_t类型从主机序转换到网络序
uint32_t ntohl(uint32_t netlong);        //把uint32_t类型从网络序转换到主机序
uint16_t ntohs(uint16_t netshort);        //把uint16_t类型从网络序转换到主机序

借鉴的两者转换代码:

//主机序转网络序
unsigned long long htonll(unsigned long long val)
{
    if(__BYTE_ORDER == __LITTLE_ENDIAN)  
    {
         return (((unsigned long long )htonl((int)((val << 32) >> 32))) << 32) | (unsigned int)htonl((int)(val >> 32));  
    }  
    else if (__BYTE_ORDER == __BIG_ENDIAN)  
    {  
         return val;  
    }  
}  

//网络序转主机序
unsigned long long ntohll(unsigned long long val)  
{  
    if (__BYTE_ORDER == __LITTLE_ENDIAN)
    {
        return (((unsigned long long )ntohl((int)((val << 32) >> 32))) << 32) | (unsigned int)ntohl((int)(val >> 32));  
    }  
    else if (__BYTE_ORDER == __BIG_ENDIAN)  
    {  
        return val;  
    }
 }

 

posted @   明庭  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示