【C++】十六进制数据的字节序排列问题、大小端

十六进制数据的字节序排列问题,涉及到 大小端(Endianness) 的概念。 包括它与大小端存储方式的关系。


1. 十六进制数据在内存中的存储

定义的数据
#define FRAME_TYPE_PARAM_SET 0x3001
  • 0x3001 是一个 16 位(2 字节)整数
  • 在内存中,0x3001 的存储方式依赖于系统的字节序:
    • 小端模式(Little Endian):低字节存储在低地址,高字节存储在高地址。
    • 大端模式(Big Endian):高字节存储在低地址,低字节存储在高地址。
两种存储方式的内存布局

0x3001 为例,16 位数值可以拆分为两个字节:

  • 高字节:0x30
  • 低字节:0x01
模式存储顺序内存布局
小端低字节 -> 高字节0x01 0x30
大端高字节 -> 低字节0x30 0x01

2. 小端与大端在数据发送中的影响

发送的数据

当你发送 0x3001 时:

  • 如果主机采用 小端模式(如 x86 处理器),数据将以小端格式排列发送:
    • 先发送低字节 0x01,再发送高字节 0x30
  • 如果主机采用 大端模式,数据将以大端格式排列发送:
    • 先发送高字节 0x30,再发送低字节 0x01
监控工具显示

监控工具通常直接按照字节顺序显示数据:

  • 如果是 小端发送
    • 数据在监控中会显示为 0x01 0x30,即你看到的 0130
  • 如果是 大端发送
    • 数据在监控中会显示为 0x30 0x01,即与定义一致。

3. 如何确认主机的字节序?

可以通过以下代码确认主机是小端还是大端:

#include <iostream>int main() {uint16_t value = 0x1234;  // 定义一个16位数uint8_t* ptr = reinterpret_cast<uint8_t*>(&value);if (*ptr == 0x34) {std::cout << "Little Endian (小端)" << std::endl;} else {std::cout << "Big Endian (大端)" << std::endl;}return 0;
}
  • 如果输出 Little Endian,说明主机是小端模式(大多数处理器如 x86、ARM 默认是小端)。
  • 如果输出 Big Endian,说明主机是大端模式。

4. 如何解决发送时的字节序问题?

如果协议要求以 大端模式 发送数据(即高字节在前),而你的主机是 小端模式,需要在发送之前进行字节序转换。

使用系统提供的字节序转换函数

在 POSIX 系统(Linux、Windows)中,可以使用以下函数:

  • htons:将 16 位整数从主机字节序转换为网络字节序(大端)。
  • htonl:将 32 位整数从主机字节序转换为网络字节序(大端)。

示例:

#include <arpa/inet.h>  // 或 winsock2.huint16_t value = 0x3001;
uint16_t bigEndianValue = htons(value);  // 转换为大端
手动实现字节序转换

也可以通过位运算手动转换:

uint16_t toBigEndian(uint16_t value) {return (value >> 8) | (value << 8);
}

5. 总结

现象
  • 代码中定义的 0x3001 在内存中是按字节存储的。
  • 主机是小端模式时,低字节(0x01)会在前,发送时的顺序也是低字节在前,因此VS监控工具显示 0130
涉及知识点
  • 大小端模式(Endianness)
    • 小端:低字节在前(如 0x01 0x30)。
    • 大端:高字节在前(如 0x30 0x01)。
  • 网络字节序
    • 大端是网络协议的通用字节序。
    • 如果主机是小端,需要在发送前进行字节序转换。
现象
  • 如果协议要求大端格式,使用字节序转换函数(如 htons)确保发送的数据符合协议。
  • 如果协议明确允许小端格式,可以直接发送,不需要额外处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/20651.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA题目笔记(十七)TreeSet对象排序+Map集合练习

一、TreeSet对象排序&#xff1a; 需求&#xff1a; public class Student implements Comparable<Student>{private String name;private int age;private int grade_Yu;private int grade_Shu;private int grade_Yin;private int sumthis.grade_Yinthis.grade_Shuthis…

w046基于web的古典舞在线交流平台的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

【迅为】瑞芯微-RK3568开发板Linux+HAL启动测试

迅为iTOP&#xff0d;RK3568开发板AMP AMP SDK支持Rockchip平台异构多系统AMP&#xff08;非对称多核架构&#xff09;的开发软件包&#xff0c;支持Linux(Kernel)、Standalone(Hal)、RTOS(RT-Thread)组合AMP构建形式。可以满足一些特定行业应用&#xff0c;如电力物联网、电…

渗透测试--Windows系统下的文件传输手段

很多情况下&#xff0c;我们渗透测试都面临需要上传和下载文件的文件传输需求。本文专门探讨Windows服务器或主机上实施文件传输的各种方案。该专题比较敏感&#xff0c;该文章仅供学习使用&#xff0c;不要用于非法用途。 编码方法 Linux检查文件MD5 md5sum id_rsa Linux编…

视觉常用Backbone大全:VisionTransformer(ViT)

视觉常用Backbone大全 今天介绍的主干网络模型叫VisionTransformer&#xff0c;是一种将 Transformer 架构应用于计算机视觉任务的模型&#xff0c;通过将图像进行切块&#xff0c;将图片转变为self-attention认识的token输入到Transformer模块中&#xff0c;实现了Transformer…

星海智算:Stable Diffusion3.5镜像教程

Stable Diffusion3.5 模型介绍 Stable Diffusion 3.5是由Stability AI推出的最新图像生成模型&#xff0c;它是Stable Diffusion系列中的一个重大升级。这个模型家族包括三个版本&#xff0c;分别是Stable Diffusion 3.5 Large、Stable Diffusion 3.5 Large Turbo和Stable Dif…

[JavaWeb] 尚硅谷JavaWeb课程笔记

1 Tomcat服务器 Tomcat目录结构 bin&#xff1a;该目录下存放的是二进制可执行文件&#xff0c;如果是安装版&#xff0c;那么这个目录下会有两个exe文件&#xff1a;tomcat10.exe、tomcat10w.exe&#xff0c;前者是在控制台下启动Tomcat&#xff0c;后者是弹出GUI窗口启动To…

【Unity基础】认识Unity中的包

Unity中的包是一个核心概念&#xff0c;像Unity本身的功能的扩展&#xff0c;或者项目中资源的管理&#xff0c;都是通过包的形式来实现的。 一、什么是包&#xff1f; 一个包包含满足您项目各种需求的功能。这可以包括编辑器安装过程中附带的任何核心Unity功能&#xff0c;也…

elment-ui的折叠tree表单实现纯前端搜索,展开收起功能

好久没更新博客了~ 记录一下本次做的一个很扯的需求 纯前端去实现这个查询的功能,后台返回的是个数组对象,前端要给他包装成树结构先展示 之后参考代码路径src\views\goods\category\index.vue 需求描述: 搜索输入任何一个关键字,都会展开他的父级,两个栏目都包含了,那么两个父…

linux先创建文件夹后指定创建文件夹用户

1、创建文件夹&#xff0c;然后创建用户并指定用户目录&#xff0c;然后修改目录所有权给该目录 # 创建 /home/test 目录 mkdir /home/test # 设置权限&#xff08;确保有适当的读写权限&#xff09; chown root:root /home/test chmod 700 /home/test # 创建 xl 用户并指定家…

大模型(LLM)全参数微调有哪些技巧,常用的轻量级微调有哪些,微调策略应该如何选择?

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下大模型(LLM)全参数微调有哪些技巧&#xff0c;常用的轻量级微调有哪些&#xff0c;微调策略应该如何选择&#xff1f;本文将从大模型(LLM)全参数微调技巧&#xff0c;常用的轻量级微调方法&#xff0c;微调策略应该…

蓝牙电话-如何自动切换手机SIM卡(预研方向)

蓝牙电话-如何自动切换手机SIM卡&#xff08;预研方向&#xff09; 一、前言 最近突然有客户问说&#xff0c;蓝牙电话的app既然已经能统计手机里面插了多少张卡&#xff0c;那能不能做双卡的SIM卡自动切换&#xff1f;即&#xff1a;设置一个呼叫策略和频率&#xff0c;当打…

【蓝桥杯C/C++】C语言和C++的常量概念与区别分析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 &#x1f4af;前言&#x1f4af;常量的概念和作用&#x1f4af;C语言中 const 的应用与限制#define 和 enum 的使用方法 &#x1f4af;C 中 const 的计算方法和处理&#x1f4af;代码实例和应用区别&#x1f…

全面解析亚马逊云服务器(AWS):功能、优势与使用指南

亚马逊云服务器&#xff08;AWS&#xff09;概述 亚马逊云服务器&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;是全球领先的云计算平台&#xff0c;提供一系列强大且灵活的云服务&#xff0c;帮助企业和开发者通过云基础设施实现数据存储、计算、分析和机器…

“小浣熊家族AI办公助手”产品体验 — “人人都是数据分析师”

一、引言&#xff1a; 大家平时应该在工作中常常使用到Excel来做数据统计&#xff0c;比如临近过年时&#xff0c;公司一般会开各种复盘、年终、检讨、明年规划大会&#xff0c;势必需要准备一大堆的量化数据报表&#xff0c;用于会议上的数据汇报、分析工作&#xff0c;试想一…

C盘扩容(C盘右键无法扩展卷解决)超详细步骤!!!

目录 1、问题及需求2、解决办法方法2 1、问题及需求 今天一看C盘爆红了&#xff0c;但是D盘还剩很多空间&#xff0c;想要从D盘再分出来50G给C盘。 但是压缩了D盘&#xff0c;在C盘扩展卷&#xff0c;实现不了&#xff0c;因为不仅挨着。看下边的解决办法 2、解决办法 桌面上…

机器学习笔记 // 天气预报、股票价格以及历史轨迹(如摩尔定律)// 时间序列的常见属性

时间序列随处可见。你可能已经在天气预报、股票价格以及历史轨迹[如摩尔定律&#xff0c;见下图​]等事物中见过它们。摩尔定律预测微芯片上面的晶体管个数大约每两年会翻倍。几乎50年以来&#xff0c;它已经被证明对未来的计算能源和成本来说是一个准确的预测器。 许多时间序列…

mysql日志写满出现The table ‘xxxx_amazon_order’ is full

数仓发现写数据出现 SQL 错误 [1114] [HY000]: The table ‘xxxx_amazon_order’ is full 1.第一时间查看系统磁盘, 发现空间写满了 df -h因为mysql是使用docker部署的, Docker 的默认存储位置在 /var/lib/docker /var 目录默认是在根分区 (/dev/mapper/centos-root) 下的 …

(一)Ubuntu22.04服务器端部署Stable-Diffusion-webui AI绘画环境

一、说明 cup型号&#xff1a; Intel(R) Celeron(R) CPU G1610 2.60GHz 内存大小&#xff1a; 8G 显卡型号&#xff1a;NVIDIA P104-100 注意&#xff1a;系统睡眠问题 sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 网卡设置 …

springboot:少量配置信息情形

发现无论怎么改都还是指向8001 所以换一种方法 通过 结果 代码 import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCusto…