【数据存储】大/小端存储与字节顺序转换函数详解

2024-08-25 10:52

本文主要是介绍【数据存储】大/小端存储与字节顺序转换函数详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习目的是使用,网络编程主机字节顺序与网络字节顺序转换这块就用到了这些概念及其函数!

【Linux网络编程入门】Day5_socket编程基础

文章目录:

  1. 大端存储与小端存储
    1.1 低地址与高地址
    1.2 数据的高位与低位
    1.3 大端存储
    1.3.1 定义
    1.3.2 小端存储举例

  2. 小端存储
    2.1. 定义
    2.2 小端存储举例

  3. Linux网络通信
    3.1 四个函数存在的意义
    3.2. htonl())函数
    3.3. htons()函数
    3.4. ntohs()函数
    3.5. ntohl()函数

大端存储与小端存储

大端:将数据的低位字节放到高地址空间,高位字节放到低地址空间。地址由小向大增加,而数据从高位往低位放;
小端:将数据的低位字节放到低地址处,高位字节放到高地址处。高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致;
低地址与高地址
高地址:值较大的地址  
低地址:值较小的地址
注意:计算机读数据永远是从低地址开始的!!!

在这里插入图片描述

数据的高位与低位
数据的高位:数据左边位置的数
数据的低位:数据右边位置的数
数据的高位和低位又称高字节和低字节

在这里插入图片描述

大端存储
1. 定义
将数据的低位字节放到高地址空间,高位字节放到低地址空间。地址由小向大增加,而数据从高位往低位放;
2.小端存储举例
存放二进制数:1011-0100-1111-0110-1000-1100-0001-0101
  • 存放的时是以一个存储单元为单位来存放
  • 读取从低地址读起!我们知道这是小端存储,所以在读出来的时候会从高位开始放

在这里插入图片描述
在这里插入图片描述

小端存储
1. 定义
将数据的低位字节放到低地址处,高位字节放到高地址处。高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致;
2.小端存储举例
  • 存放的时是以一个存储单元为单位来存放
  • 读取从低地址读起!我们知道这是小端存储,所以在读出来的时候会从低位开始放
存放二进制数:1011-0100-1111-0110-1000-1100-0001-0101

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Linux网络通信


参考链接:https://blog.csdn.net/m0_73825482/article/details/134315400

四个函数存在意义

为什么存在这个函数呢?或者存在这个函数的意义?(大端小端存储

先引入字节存放的两个概念一个是“大端顺序”,一个是“小端顺序”。俗称“小尾顺序”、“大尾顺序”。简单的说就是对应数据的高字节存放在低地址,低字节存放在高地址上就是大端顺序;
对应数据的高字节存放在高地址,低字节存放在低地址上就是小端顺序。
比如 unsigned long hostlong = 0xa2b4c6d8;
大端顺序存放:
偏移地址       存放内容
0x00000000 0xa2
0x00000001 0xb4
0x00000002 0xc6
0x00000003 0xd8小端顺序存放:
偏移地址      存放内容
0x00000000 0xd8
0x00000001 0xc6
0x00000002 0xb4
0x00000003 0xa2
同理推理16位数以及64位数。一般地,在我的编译器里面设置的是小端顺序,这个可以根据自己的编译器看下设置,这里不深入说明。
但是网络传输数据采用的是大端顺序。
所以这才涉及到主机字节顺序和网络字节顺序,再说的详细一点,主机字节顺序可能是大端顺序或者小端顺序(这个要看编译器的设置,还有自己是用的C还是Java还是其他的语言,其各自都是不尽相同),但是网络字节顺序一定是大端顺序。
1. htonl()函数
原型:uint32_t htonl(uint32_t hostlong)
参数:hostlong:主机字节顺序表达的32位数htonl中的h–host主机地址,to–to,n–net网络,l–unsigned long无符号的长整型(32位的系统是4字节);
返回值:一个32位的网络字节顺序;
作用:将一个32位数从主机字节顺序转换成网络字节顺序。
2. htons()函数
原型:uint16_t htons(uint16_t hostlong)
参数:hostlong是主机字节顺序表达的16位数htons中的h–host主机地址,to–to,n–net网络,s–unsigned short无符号的短整型(32位的系统是2字节);
返回值:一个16位的网络字节顺序;
作用:将一个16位数从主机字节顺序转换成网络字节顺序,简单的说就是把一个16位数高低位呼唤。
3. ntohs()函数
原型:uint16_t ntohs(uint16_t netshort)
参数:netshort是网络字节顺序表达的16位数ntohs中的n–net网络,to–toh–host主机地址,s–unsigned short无符号的短整型(32位的系统是2字节);
返回值:一个16位的主机字节顺序;
作用:将一个16位数由网络字节顺序转换为主机字节顺序,简单的说就是把一个16位数高低位互换。
4. ntohl()函数
原型:uint32_t ntohs(uint32_t netlong)
参数:netlong是网络字节顺序表达的32位数ntohs中的n–net网络,to–toh–host主机地址,l–unsigned long无符号的长整型(32位的系统是4字节);
返回值:一个32位的主机字节顺序;
作用:将一个32位数由网络字节顺序转换为主机字节顺序。

这篇关于【数据存储】大/小端存储与字节顺序转换函数详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105363

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>