C++系统相关操作7 - 判断系统大小端大小端的数据转换

  • 1. 关键词
  • 2. sysutil.h
  • 3. sysutil.cpp
  • 4. 测试代码
  • 5. 运行结果
  • 6. 源码地址

1. 关键词

关键词:

C++ 大端 小端 数据转换 跨平台

大小端的定义:

大端(Big Endian)和小端(Little Endian)是指在计算机内存中存储多字节数据类型的字节顺序。以下是它们的区别:

大小端定义区别示例(0x1234)
大端数据的最高有效字节(Most Significant Byte, MSB)存储在内存的最低地址,而最低有效字节(Least Significant Byte, LSB)存储在内存的最高地址。最高有效字节存储在最低地址
又称:网络字节序
内存地址: 高 -> 低
存储内容: 0x34 0x12
小端数据的最低有效字节(Least Significant Byte, LSB)存储在内存的最低地址,而最高有效字节(Most Significant Byte, MSB)存储在内存的最高地址。最低有效字节存储在最低地址
又称:主机字节序
内存地址: 高 -> 低
存储内容: 0x12 0x34

实现原理:

通过高低地址位的数据判断大端或小端。

应用场景:

  • 网络传输协议中,大端和小端的字节序不同,需要转换为网络字节序。
  • 不同平台的数据交换,需要转换为统一的字节序。

2. sysutil.h

#pragma once#include <cstdint>
#include <string>namespace cutl
{/*** @brief Endianness type.**/enum class endian{/** little endian */little,/** big endian */big,};/*** @brief Get the program endianness.** @return endian the program endianness.*/endian endian_type();/*** @brief Byteswap a 16-bit value.** @param value the value to byteswap.* @return uint16_t the byteswapped value.*/uint16_t byteswap(uint16_t value);/*** @brief Byteswap a 32-bit value.** @param value the value to byteswap.* @return uint32_t the byteswapped value.*/uint32_t byteswap(uint32_t value);/*** @brief Byteswap a 64-bit value.** @param value the value to byteswap.* @return uint64_t the byteswapped value.*/uint64_t byteswap(uint64_t value);/*** @brief Byteswap an array of bytes.** @param data the array of bytes to byteswap.* @param size the size of the array.*/void byteswap(uint8_t *data, uint32_t size);
} // namespace cutl

3. sysutil.cpp


#include <map>
#include <iostream>
#include <strutil.h>
#include <cstdlib>
#include "sysutil.h"
#include "inner/logger.h"
#include "inner/system_util.h"
#include "inner/filesystem.h"namespace cutl
{endian endian_type(){int a = 1;int *p = &a;uint8_t *pBtye = (uint8_t *)p;if (*pBtye == 1){return endian::little;}else{return endian::big;}}uint16_t byteswap(uint16_t value){auto data = (uint8_t *)(&value);byteswap(data, 2);return value;}uint32_t byteswap(uint32_t value){auto data = (uint8_t *)(&value);byteswap(data, 4);return value;}uint64_t byteswap(uint64_t value){auto data = (uint8_t *)(&value);byteswap(data, 8);return value;}void byteswap(uint8_t *data, uint32_t size){uint32_t n = size / 2;for (uint32_t i = 0; i < n; i++){uint8_t temp = data[i];data[i] = data[size - i - 1];data[size - i - 1] = temp;}}
} // namespace cutl

4. 测试代码

#include "common.hpp"
#include "sysutil.h"void TestEndian()
{PrintSubTitle("TestEndian");if (cutl::endian_type() == cutl::endian::little){std::cout << "OS endianness: little endian" << std::endl;}else{std::cout << "OS endianness: big endian" << std::endl;}uint16_t a = 0x1234;std::cout << "byteswap for a: " << cutl::to_hex(cutl::byteswap(a)) << std::endl;uint32_t b = 0x12345678;std::cout << "byteswap for b: " << cutl::to_hex(cutl::byteswap(b)) << std::endl;uint64_t c = 0x123456789ABCDEF0;std::cout << "byteswap for c: " << cutl::to_hex(cutl::byteswap(c)) << std::endl;uint8_t bytes[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10};cutl::byteswap(bytes, 16);std::cout << "byteswap for bytes: " << cutl::to_hex(bytes, 16) << std::endl;
}

5. 运行结果

---------------------------------------------TestEndian---------------------------------------------
OS endianness: little endian
byteswap for a: 3412
byteswap for b: 78563412
byteswap for c: F0DEBC9A78563412
byteswap for bytes: 10 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 

6. 源码地址

更多详细代码,请查看本人写的C++ 通用工具库: common_util, 本项目已开源,代码简洁,且有详细的文档和Demo。

本文由博客一文多发平台 OpenWrite 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++哈希表、哈希桶的实现以及模拟实现封装unordered_map 和 unordered_set 位图 布隆过滤器 哈希切割相关

文章目录 unordered系列关联式容器unordered_mapunordered_map的接口说明 unordered_setset 与 unordered_set的效率比较 底层结构哈希概念哈希冲突哈希函数常见哈希函数哈希冲突解决闭散列 —— 开放定址法哈希表的插入线性探测二次探测 哈希表的闭散列实现哈希表的结构插入代…

1962springboot VUE社区服务平台系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE社区服务平台系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架和VUE完成本系统&#xff0c;对理解vue java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和…

二叉搜索树的删除操作(详细图解和代码解析)

二叉排序树的定义: 二叉排序树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一种二叉树&#xff0c;其中每个节点的值大于其左子树中任意节点的值&#xff0c;小于其右子树中任意节点的值。换句话说&#xff0c;对二叉排序树进行中序遍历时&#xff0c;节点的值…

MIGO增强(扩展字段,屏幕增强字段,常规保存增强)

1.MIGO前台增强: 1.SE18找到增强点:MB_GOODSMOVEMENT 2.找到相应的BADI:右键创建实施 3.找到重写的方法 METHOD if_ex_mb_document_badi~mb_document_before_update.DATA:lv_stat TYPE c,lv_type TYPE bapi_mtype,lv_msg TYPE bapi_msg.DATA:lv_message TYPE string.IF sy-tc…

vncsever ,window 远程ubuntu远程界面安装方式,VNC Viewer安装教程+ linux配置server 操作

linux 端安装 # 安装VNC 服务器软件 sudo apt install autocutsel # 剪切黏贴操作支持的包 sudo apt-get install tightvncserver # 安装的是 VNC 服务器软件&#xff0c;用于远程桌面访问 # 安装Xfce桌面环境 sudo apt-get install xfce4 xfce4-goodies #安装的是 XFCE 桌…

【高速增长的模块化仪器 该从朝阳走向正午了】

如果说人工智能统治了软件和应用&#xff0c;那么模块化就是硬件和设备的未来。从最微观的Chiplet到最宏观的云服务器&#xff0c;模块化的灵活性和高可扩展性几乎渗透到所有电子系统设计中&#xff0c;成为当之无愧的硬件结构主流。 本文引用地址&#xff1a;http://www.eepw…

前端 JS 经典:通用性函数封装思路

前言&#xff1a;设计通用性函数&#xff0c;我们需要考虑两个方面&#xff0c;一个是函数传参的可能性&#xff0c;如果可能性很多&#xff0c;我们可以将处理参数的方法暴露出去&#xff0c;让使用者去设计。为了调用的方便性&#xff0c;我们还可以做参数的归一化。 举个例…

web自动化(一)selenium安装环境搭建、DrissionPage安装

selenium 简介 selenium是企业广泛应用的web自动化框架 selenium 三大组件 selenium IDE 浏览器插件 实现脚本录制 webDriver 实现对浏览器进行各种操作 Grid 分布式执行 用例同时在多个浏览器执行&#xff0c;提高测试效率 问题&#xff1a;环境搭建复杂&#xff0c;浏览器版…

OpenCV银行卡识别思路解析

银行卡识别&#xff08;Card Recognition&#xff09;通常是一个涉及图像处理和机器学习&#xff08;特别是深度学习&#xff09;的复杂任务。这个任务通常包括多个步骤&#xff0c;如图像预处理、特征提取、字符分割和识别等。由于深度学习在图像识别领域取得了显著进展&#…

探索Scala并发编程之巅:高效并行处理的艺术

标题&#xff1a;探索Scala并发编程之巅&#xff1a;高效并行处理的艺术 引言 在现代软件开发中&#xff0c;随着多核处理器的普及&#xff0c;编写能够充分利用硬件能力的并发程序变得至关重要。Scala&#xff0c;这门结合了面向对象和函数式编程特性的语言&#xff0c;提供…

YOLOv8+SwanHub+作物检测:从可视化训练到Demo演示

1. 项目介绍 本项目旨在利用先进的YOLOv8深度学习模型对麦穗进行高效、准确的检测。我们采用了GlobalWheat数据集&#xff0c;该数据集包含丰富的麦穗图像&#xff0c;为模型的训练提供了有力的数据支持。通过该实验&#xff0c;实现高准确率的麦穗识别&#xff0c;为农业生产提…

IPv4的不同IP地址段用途介绍

目录标题 [Q&A] IP地址中/16或者/24的意义IP地址分类IP地址段用途介绍参考 [Q&A] IP地址中/16或者/24的意义 /16表示前16位是网络地址&#xff0c;后16位是主机地址。/24表示前24位是网络地址&#xff0c;后8位是主机地址。 IP地址分类 网络地址网络地址网络数主机数…

Webpack: 如何借助预处理器、PostCSS 等构建现代 CSS 工程环境

概述 在开发 Web 应用时&#xff0c;我们通常需要编写大量 JavaScript 代码 —— 用于控制页面逻辑&#xff1b;编写大量 CSS 代码 —— 用于调整页面呈现形式。问题在于&#xff0c;CSS 语言在过去若干年中一直在追求样式表现力方面的提升&#xff0c;工程化能力薄弱&#xff…

Studio One 6.6.2中文破解版安装图文激活教程

Studio One 6.6.2中文破解版做为新生代音乐工作站&#xff0c;凭借更低的价格和完备的功能&#xff0c;获得了音乐人和直播行业工作者的青睐&#xff0c;尤其是对硬件声卡的适配支持更好&#xff0c;特别适合用来配合线上教学和电商带货。 最近网上出现不少关于StudioOne不能用…

html侧导航栏客服栏

ico 替换 ICO <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>返回顶部</title><script src"js/jquery-2.0.3.min.js"…

基于 ESP8266 和 MQ 气体传感器的微信告警系统设计与实现

接线: ESP8266MQ3vVCCGND GND A0 A0微信通知截图: 摘要:本文主要探讨了一种利用 ESP8266 微控制器与 MQ 气体传感器构建的气体检测微信告警系统。详细阐述了系统的硬件组成、软件设计以及与微信平台的交互机制。通过该系统,能够实时监测环境中的气…

VPS搭建论坛和社区网站有哪些优势?

想象一下&#xff1a;您已经建立了一个论坛。这是您的骄傲和喜悦——一个熙熙攘攘的在线多人广场&#xff0c;人们聚集在这里不仅可以聊天&#xff0c;还可以交流、分享和辩论。不过突然出现下面这些情况&#xff0c; 页面加载需要很长时间&#xff1b;光标不停旋转。会员流失…

【ai】tx2 nx: trition client安装nvidia-pyindex 一直失败

系统版本的pip和python虚拟环境的pipyolov4-triton-tensorrt的master分支 官方client jetson:pip3 install --user nvidia-pyindex 不成功啊 这个是让nvidia-pyindex 拉取nvidia@tx2-nx:~$ pip3 install --user nvidia-pyindex Collecting nvidia-pyindexDownloading https://…

STL——常用算法(二)

一、常用拷贝和替换算法 1.copy #include <iostream> #include <vector> #include <algorithm> using namespace std; void printVector(int val) {cout << val << " "; } void test01() {vector<int>v1;for (int i 0; i <…

midspore打卡第五天之DDPM原理一

#### Diffusion 前向过程 所谓前向过程&#xff0c;即向图片上加噪声的过程。虽然这个步骤无法做到图片生成&#xff0c;但这是理解diffusion model以及构建训练样本至关重要的一步。 首先我们需要一个可控的损失函数&#xff0c;并运用神经网络对其进行优化。 设 $q(x_0)$ 是…