首页 > 其他分享 >网络字节序与主机字节序的转换函数实践

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

时间:2022-10-07 11:58:15浏览次数:47  
标签:__ box 字节 val 主机 unsigned long u32 函数

网络字节序与主机字节序的相互转换

常用系统调用

Linux socket网络编程中,经常会使用下面四个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类型从网络序转换到主机序

64位数值的转换

现在如果需要对64位类型数据进行主机字节序与网络字节序的转换,没有现成系统API可用,可以通过下面两种方法进行转换:

使用移位:
//主机序转网络序
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;  
    }
 }
使用联合体union

根据联合体的特性:联合中所有成员引用的是内存中相同的位置,其长度为最长成员的长度。

typedef struct {  
    unsigned int u32_h;  
    unsigned int u32_l;  
}Int64_t;  
  
typedef union {  
    unsigned long long u64;  
    Int64_t st64;  
}Convert64_t;

//主机序转网络序
unsigned long long htonll(unsigned long long val)
{  
	if (__BYTE_ORDER == __LITTLE_ENDIAN)
	{
		Convert64_t box_in, box_out;  
  
		box_in.u64 = val;  
		box_out.st64.u32_h = htonl(box_in.st64.u32_l);  
		box_out.st64.u32_l = htonl(box_in.st64.u32_h);  
		return box_out.u64;
	}
	else if (__BYTE_ORDER == __BIG_ENDIAN)  
    {  
        return val;
    }
}

//网络序转主机序
unsigned long long ntohll(unsigned long long val)  
{
    if (__BYTE_ORDER == __LITTLE_ENDIAN)
    {
		Convert64_t box_in, box_out;  
  
		box_in.u64 = val;  
		box_out.st64.u32_h = ntohl(box_in.st64.u32_l);  
		box_out.st64.u32_l = ntohl(box_in.st64.u32_h);  
		return box_out.u64;
	}
	else if(__BYTE_ORDER == __BIG_ENDIAN)
	{
		return val;
	}
}

标签:__,box,字节,val,主机,unsigned,long,u32,函数
From: https://www.cnblogs.com/chenzhiye1845/p/16759378.html

相关文章

  • 激活函数还是有一点意思的!
    激活函数(Activationfunctions)对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如在神经元中,输入的......
  • KAL1 LINUX 官方文档之虚拟机版本 --- 在 Kali(主机)上安装 VirtualBox (更新于2022)
    在Kali(主机)上安装VirtualBox您可以在KaliLinux上安装VirtualBox ,允许您在KaliLinux中使用虚拟机(VM)。但是,如果您想将KaliLinux安装为VM,则需要我们的KaliL......
  • KAL1 LINUX 官方文档之虚拟机版本 --- 在 Apple Silicon (M1/M2) Mac(主机)上安装 VMwa
    您需要使用VMWare技术预览版的22H2版本。如果您至少没有使用PlayerVersionexp(20191287),那么您需要更新。由于VMWare更新程序软件的限制,如果您使用的是较早版......
  • 最近流行的激活函数
    最近又看了点深度学习的东西,主要看了一些关于激活函数的内容,不知道算不算新颖,但是我想把自己阅读后的分享一下,请各位给予评价与指点,谢谢!一般激活函数有如下一些性质:非线性: ......
  • 网络字节序与主机字节序的转换函数实践
    首先我们要对于网络字节序和主机字节序有一个初步的概念。字节序:字节在内存中储存的顺序字节序的种类:(1):大端字节序,数值高位储存在内存的低地址,低位储存在内存的高地址,在 ......
  • 【我开了C语言的金手指】二.函数(1)
    (一)函数的定义 是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定的任务,相较于其它的代码,具备相对独立性。 一般会有输入参数并有返回值,提供对过......
  • 【VB.NET】VB的字符操作函数
    函数以及其参数说明Asc/AscW(Char/String)AsInteger返回一个代表某个字符的字符编码的Integer值。Chr/ChrW(Integer)AsChar返回指定字符编码对应的字符。Filter(String(......
  • 我整理了50道经典Java算法题,直接进了字节跳动!!
    写在前面最近,很多小伙伴都想进入字节跳动这个快速发展的公司,而字节跳动对于算法的要求比较高。于是乎,有些小伙伴问我能否整理一些基础的算法题,帮助他们提升下基础算法能......
  • 网络字节序与主机字节序
    字节序字节序是什么呢?根据字面意思来看,就可以大概知道它的意思.就是字节在内存中存放的顺序.然而,字节序又分为大端字节序和小端字节序举个例子300......
  • g2o函数
    g2o简介g2o(GeneralGraphicalOptimization),是一个在SLAM领域广为使用的优化库。基于图优化理论。图优化理论把优化问题表现成图的一种方式。一个图由若干个顶点和连接......