字节序转换函数

2023-11-14

由于主机的千差万别,主机的字节序不能做到统一,但是对于网络上传输的变量,它们的值必须有一个统一的表示方法。网络字节序是指多字节变量在网络传输时的表示方法, 网络字节序采用大端字节序的表示方法。 所以小端字节序的系统通过网络传输变量的时候需要进行字节序转换,而大端字节序的变量则不要。

Linux系统提供了如下函数进行字节序的转换。

#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);

传入的参数为需要转换的变量,返回值为转换后的数值。
函数名中,h表示host,即主机字节序;n表示network,即网络字节序;l表示long, s表示short。
htonl()表示 “主机字节序” 转换为 “网络字节序”, 操作的变量为”long型变量”。

一个字节序转换的例子:

#include <stdio.h>
#define BITS16 16
#define BITS32 32
typedef union
{
    unsigned short int value;
    unsigned char byte[2];
} to16;

typedef union
{
    unsigned long int value;
    unsigned char byte[4];
} to32;

void showvalue(unsigned char *begin, int flag)
{
    int num = 0, i = 0;
    if (flag == BITS16)
        num = 2;
    else if (flag == BITS32)
        num = 4;
    for (i = 0; i < num; i++)
    {
        printf("%x ",*(begin+i));
    }

    printf("\n");
}

int main()
{
    to16 v16_orig, v16_turn1, v16_turn2;
    to32 v32_orig, v32_turn1, v32_turn2;

    v16_orig.value = 0xabcd;
    v16_turn1.value = htons(v16_orig.value); //第一次转换
    v16_turn2.value = htons(v16_turn1.value); //第二次转换

    v32_orig.value = 0x12345678;
    v32_turn1.value = htonl(v32_orig.value);
    v32_turn2.value = htonl(v32_turn1.value);

    printf("16 host to network byte order change:\n");
    printf("\torig:\t"); 
    showvalue(v16_orig.byte, BITS16); //16位数值的原始值
    printf("\t1 times:");
    showvalue(v16_turn1.byte,BITS16);
    printf("\t2 times:");
    showvalue(v16_turn2.byte,BITS16);


这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字节序转换函数 的相关文章

  • http请求学习

    GET 向Web服务器请求一个文件 POST 向Web服务器发送数据让Web服务器进行处理 PUT 向Web服务器发送数据并存储在Web服务器内部 HEAD 检查一个对象是否存在 DELETE 从Web服务器上删除一个文件 CONNECT
  • valgrind:内存泄漏的检查工具

    valgrind 是帮助程序员寻找程序里的 bug 和改进程序性能的工具集 擅长发现内存的管理问题 里面有若干工具 其中最重要的是 memcheck 工具 用于检查内存的泄漏 memcheck 能发现如下的问题 使用未初始化的内存 使用已经
  • 网络传输的基本流程

    1 网络传输的进本流程 同一网段内两台主机进行文件传输 文件传输的流程 2 理解封装和分用 不同协议对数据报有不同的称谓 在传输层叫做段 segment 在网络层叫做数据报 datagram 在链路层叫做帧 frame 应用层数据通过协议栈
  • 06libevent下通信中bufferevent缓冲区的特性介绍

    06libevent下通信中bufferevent缓冲区的特性介绍 以下是关于libevent学习的相关文章 01libevent库的下载与安装并且测试是否安装成功 02libevent库的整体框架思想 03libevent下通信的主要函数
  • SQLite3 操作命令以及c/c++编程API和例子

    文章目录 数据库系统 SQLite SQLite数据类型 SQLite语句介绍 表的创建和查看 表的删除插入和修改 表数据的删除 复制表和修改表结构 事务处理 函数操作 数据分组group by 约束 联结表 视图view 触发器trigg
  • libevent 源码分析丨libevent组件构成以及编程要领

    1 前言 Libevent是一个轻量级的开源高性能网络库 使用者众多 研究者更甚 相关文章也不少 写这一系列文章的用意在于 一则分享心得 二则对libevent代码和设计思想做系统的 更深层次的分析 写出来 也可供后来者参考 文章较长 建议
  • select函数的分析

    select函数位于头文件 include
  • Linux网络编程socket错误分析

    转自 http aigo iteye com blog 1911134 socket错误码 EINTR 4 阻塞的操作被取消阻塞的调用打断 如设置了发送接收超时 就会遇到这种错误 只能针对阻塞模式的socket 读 写阻塞的socket时
  • Linux时间操作(time、gettimeofday)

    自 http blog chinaunix net space php uid 24148050 do blog id 320294 一 time函数 include
  • 抓包工具Wireshark使用体会

    这两天在工作上遇到了一些问题 必须要用抓包工具来捕获手机端发送过来的数据包 分析其帧结构 以前虽然学习过网络知识 但是也从未接触过抓包工具Wireshark 迫于工作的压力 自己在摸索中学到了一些基本的使用方法 文件格式 pcap 帧排序
  • 02线程池的结构体描述信息

    02线程池的结构体描述信息 01线程池原理剖析 02线程池的结构体描述信息 03线程池的各个函数解析 04线程池完整的头文件和实现文件 c 直接看代码 代码里有详细的注释 描述任务队列的结构体 typedef struct void fun
  • Ubuntu 设置时区

    我们要设置成 CST 时区 以保证正确地显示日期 时间 我们常看到的时区有如下几个 PST 美国太平洋标准时间 PST GMT 8 GMT 格林尼治平均时间 等同于英国伦敦本地时间 UTC 通用协调时间 UTC GMT CST 北京时间 北
  • TCP协议通讯流程——三次握手四次挥手

    TCP协议通讯流程 如图 1 服务器的初始化 服务器端 调用socket 创建文件描述符 调用bind 将当前文件描述符与IP地址跟端口号绑定在一起 如果该端口号已经被其它进程占用了 就会bind失败 调用listen 声明当前文件描述符为
  • 分配给套接字的IP地址与端口号

    文章目录 1 网络地址 Internet Address 2 网络地址分类与主机地址边界 3 用于区分套接字的端口号 IP 是 Internet Protocol 网络协议 的简写 是为收发网络数据而分配给计算机的值 端口号并非赋予计算机的
  • SOCK_RAW PF_PACKET IPv6带物理地址发送报文

    通过link layer发送IPv4 IPv6 例子如下 http www pdbuchan com rawsock rawsock html 发送ipv4 http www pdbuchan com rawsock tcp4 ll c 发
  • 日志 - 客户端及服务端写法

    一 客户端 先来看一个日志类的实现方法 这个日志类也是代表着大多数客户端日志的主流写法 log h 1 ifndef LOG H 2 define LOG H 3 4 include
  • 字节序转换函数

    由于主机的千差万别 主机的字节序不能做到统一 但是对于网络上传输的变量 它们的值必须有一个统一的表示方法 网络字节序是指多字节变量在网络传输时的表示方法 网络字节序采用大端字节序的表示方法 所以小端字节序的系统通过网络传输变量的时候需要进行
  • 网络字节序与地址变换

    文章目录 1 主机字节序与网络字节序 2 字节序转换 Endian Conversions 1 主机字节序与网络字节序 CPU 向内存保存数据的方式有 2 2 2 种 这意味着 CPU 解析数据的方式也分为 2 2 2 种
  • 协议定制 + Json序列化反序列化

    文章目录 协议定制 Json序列化反序列化 1 再谈 协议 1 1 结构化数据 1 2 序列化和反序列化 2 网络版计算器 2 1 服务端 2 2 协议定制 1 网络发送和读取的正确理解 2 协议定制的问题 2 3 客户端 2 4 代码 3
  • TCP发送数据流程详解

    B S通信简述 整个计算机网络的实现体现为协议的实现 TCP IP协议是Internet的核心协议 HTTP协议是比TCP更高层次的应用层协议 HTTP HyperText Transfer Protocol 超文本传输协议 是互联网上应用

随机推荐

  • 前端WEB安全

    一 浏览器安全 首先了解前端web安全知识 比不可绕开的基础就是同源策略了 同源策略 Same Origin Policy 是一种约定 它是浏览器最核心也最基本的安全功能 如果缺少了同源策略 则浏览器的正常功能可能都会受到影响 可以说Web
  • 你想改变现在的生活吗?

    你想改变现在的生活吗 你想加薪吗 想买车吗 想找到你生命中的另一半吗 去学习吧 学校是个神奇的地方
  • 记一次解决联想笔记本冬天卡顿反应慢的方法

    个人简介 个人主页 九黎aj 幸福源自奋斗 平凡造就不凡 如果文章对你有用 麻烦关注点赞收藏走一波 感谢支持 欢迎订阅我的专栏 autojs 图携带方便买了一个联想笔记本 然后发现笔记本充电时候正常 不卡 不充电时候会卡0 4Ghz ctr
  • Java包装类、自动装箱与拆箱知识总结

    因为在学习集合时知道集合里存放的对象都是Object类型 取出的时候需要强制类型转换为目标类型 使用泛型集合不需要 如int a Integer arrayList get 0 然后我们就会发现 为什么要强制转换为Integer 而不是in
  • C++中const,指针和引用

    C 中的const 指针和引用 在线C C 编译器 可以试着运行代码 C 中的const 在C语言中 const修饰的量称为常变量 在编译过程中 const就是当成变量的编译生成指令的 不可以直接修改它的值 但是可以通过地址进行修改其对应的
  • springmvc 获取项目中的所有请求路径

    springboot springmvc 获取项目中的所有请求路径 1 编写业务代码 Autowired private WebApplicationContext applicationContext GetMapping getAllU
  • 关于vue2中$set及$delete的使用

    this set的使用 在平时使用vue进行开发的时候 我经常会遇到一个这样的问题 就是当data中包含声明且已赋值的对象或者数组 数组包对象 时 我们要向当前的这个对象中添加一个新的属性并且更新 结果发现并不会更新视图 只在控制台打印
  • Java读取操作大数据excel

    工作需要 读取大数据量的excel 用Apache poi的普通模式读取 会抛内存溢出 查询文档得知有另外一种模式 用户模式 该模式不会一下子整个文件load进来放在内存里 而是一行一行的读取 这样就能避免内存溢出了 上码 package
  • 数据库的数据类型

    数据库技术 1 创建数据表的语法规则 CREATE TABLE lt 表名 gt lt 列名 gt lt 数据类型 gt lt 列级完整性约束条件 gt lt 列名 gt lt 数据类型 gt lt 列级完整性约束条件 gt lt 表级完整
  • Yum安装MySQL8.0版本

    文章目录 Yum安装MySQL8 0版本 实验环境 一 配置yum源 1 先备份Centos Base repo 然后从阿里云下载centos7 repo 备份本地yum源 下载阿里云的yum源 2 安装之前的环境检查 查看是否已经安装My
  • 【构建ML驱动的应用程序】第 9 章 :选择部署选项

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • rs lidar速腾激光雷达使用方法之录包及离线播放

    目录 一 录包packet 1 修改雷达参数配置config 2 录包 二 播放包 1 修改雷达参数配置config 2 编译 运行驱动 3 播放包 一 录包packet 1 修改雷达参数配置config 可以直接录制点云消息 但这种方法会
  • Python文件操作和管理指南:打开、读取、写入和管理文件

    文章目录 文件 File 打开文件 使用 with as 语句打开文件 读取文件内容 读取大文件的方式 逐行读取和读取全部行 写文件操作 文件定位 seek tell 关闭文件 文件管理 获取目录结构 获取当前目录 切换当前所在目录 创建目
  • 安装Git后所需的配置

    文章目录 前言 一 Git的配置 二 idea连接github 1 在idea中进行git的配置 2 通过账号密码或私人令牌连接GitHub 前言 上周刚接触了git遇到一些问题 今天总结一下 一 Git的配置 1 第一次安装git需要配置
  • 想让你的某个文件不被删除不被移动不被重命名吗?很简单,see it!!!

    include
  • python爬取邮件内容_python简单爬虫,抓取邮箱

    最近 老师给了一个练习是 实现一个爬虫 就爬大概100个网页 匹配出邮箱 于是 我花了几天时间 熟悉熟悉了python 就有了下面这个超级简单的爬虫程序 各种毛病 这里先说明一下 python库的安装 因为我在这上面浪费了不少时间 首先是p
  • mongodb连接报错:connect@src/mongo/shell/mongo.js:374:17

    mongodb部署在云服务器上一直可以用 今天重启了一下 不知道为什么一直连接不上 就很慌 报的这个错误代码 去百度了半天也没找到一样的情况 直接我使用了net start mongodb 整个人都傻了 mongodb需要起服务的 起了以后
  • Android LocalBroadCastManager 使用总结

    1 概述 在Android中 BroadCast是一种广泛运用的在应用程序之间传输信息的机制 我们拿广播电台来打比方 我们平常使用收音机是这样的 许多不同的广播电台通过特定的频率来发送他们的内容 而我们用户只需要将频率调成和广播电台的一样就
  • Entity Framework Core系列教程-22-跟踪实体图(TrackGraph)

    Entity Framework Core中的ChangeTracker TrackGraph 在上一章中 您了解了不同的方法为Entity Framework Core 2中的实体图的每个实体设置不同的EntityState 在这里 您将
  • 字节序转换函数

    由于主机的千差万别 主机的字节序不能做到统一 但是对于网络上传输的变量 它们的值必须有一个统一的表示方法 网络字节序是指多字节变量在网络传输时的表示方法 网络字节序采用大端字节序的表示方法 所以小端字节序的系统通过网络传输变量的时候需要进行