C++11(Linux/GCC)字节序工具

#pragma once
#include <cstdint>
#include <climits>
#include <type_traits>  // 用于类型检查// 端序宏获取(保持原有逻辑)
#if __has_include(<endian.h>)#include <endian.h>
#elif __has_include(<bits/endian.h>)#include <bits/endian.h>
#endif// 编译期端序判断(增加 constexpr 定义)
#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__)constexpr bool host_is_little_endian = (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__);constexpr bool host_is_big_endian    = (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__);
#elseconstexpr bool host_is_little_endian = true;  // 默认小端(x86 为主)constexpr bool host_is_big_endian    = false;
#endif// 字节交换:使用 constexpr + noexcept 增强
constexpr uint16_t bswap16(uint16_t x) noexcept {
#if defined(__GNUC__) || defined(__clang__)return __builtin_bswap16(x);
#elsereturn static_cast<uint16_t>((x << 8) | (x >> 8));
#endif
}constexpr uint32_t bswap32(uint32_t x) noexcept {
#if defined(__GNUC__) || defined(__clang__)return __builtin_bswap32(x);
#elsereturn (x << 24) |((x & 0x0000FF00u) << 8) |((x & 0x00FF0000u) >> 8) |(x >> 24);
#endif
}constexpr uint64_t bswap64(uint64_t x) noexcept {
#if defined(__GNUC__) || defined(__clang__)return __builtin_bswap64(x);
#elsereturn  (x << 56) |((x & 0x00FF000000000000ull) >> 40) |((x & 0x0000FF0000000000ull) >> 24) |((x & 0x000000FF00000000ull) >> 8 ) |((x & 0x00000000FF000000ull) << 8 ) |((x & 0x0000000000FF0000ull) << 24) |((x & 0x000000000000FF00ull) << 40) |(x >> 56);
#endif
}// 重载函数:统一命名 + 类型约束(更符合 C++ 风格)
template <typename T>
constexpr typename std::enable_if<std::is_same<T, uint16_t>::value, T>::type
to_network(T v) noexcept {return host_is_little_endian ? bswap16(v) : v;
}template <typename T>
constexpr typename std::enable_if<std::is_same<T, uint32_t>::value, T>::type
to_network(T v) noexcept {return host_is_little_endian ? bswap32(v) : v;
}template <typename T>
constexpr typename std::enable_if<std::is_same<T, uint64_t>::value, T>::type
to_network(T v) noexcept {return host_is_little_endian ? bswap64(v) : v;
}// 网络序转主机序(与主机转网络序逻辑相同,直接复用)
template <typename T>
constexpr T to_host(T v) noexcept {return to_network(v);
}// 8 位无需转换(增加类型约束)
constexpr uint8_t to_network(uint8_t v) noexcept { return v; }
constexpr uint8_t to_host(uint8_t v) noexcept { return v; }// 有符号类型转换(封装为函数,减少手动转换错误)
template <typename T>
constexpr typename std::enable_if<std::is_signed<T>::value && (sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8), T>::type
to_network_signed(T v) noexcept {using UnsignedT = typename std::make_unsigned<T>::type;return static_cast<T>(to_network(static_cast<UnsignedT>(v)));
}template <typename T>
constexpr typename std::enable_if<std::is_signed<T>::value && (sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8), T>::type
to_host_signed(T v) noexcept {return to_network_signed(v);  // 与网络转主机逻辑相同
}
  1. 编译期端序判断
    通过 __BYTE_ORDER__ 等 GCC 宏直接在编译期确定主机端序(大端 / 小端),避免运行时开销。对于不支持这些宏的环境,默认使用小端(符合多数 Linux/x86 平台特性),兼顾兼容性。

  2. 高效字节交换实现

    • 优先使用 GCC/Clang 内建函数 __builtin_bswap16/32/64,这些函数通常被编译为单条机器指令(如 bswap),性能最优。
    • 对其他编译器提供手动移位实现作为降级方案,保证功能正确性。
  3. 清晰的转换逻辑
    网络字节序固定为大端,因此:

    • 若主机是小端:转换时需要字节交换。
    • 若主机是大端:无需转换(直接返回原值)。
      逻辑简洁且高效,避免冗余操作。
  4. 完整的类型覆盖
    支持 8/16/32/64 位无符号整数,同时提供有符号整数的转换建议(通过无符号类型中转,避免符号位问题)。

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

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

相关文章

【MTCNN网络结构记忆卡片】--003nets.py

&#x1f9e0; MTCNN网络结构记忆卡片 &#xfffd;&#xfffd; 基础概念速查 &#x1f524; 库引入&#xff1a;import torch 和 import torch.nn as nn import torch # PyTorch深度学习框架 import torch.nn as nn # nn Neural Networks (神经网络)&#x1f3d7;️…

可视化-模块1-HTML-03

1.发现问题<p>大数据可视化技术及应用课程</p> <img src"pic/图片2.png" width"300" height"300"/><p></p><img />HTML 标签按闭合方式只分两类&#xff1a;双标签&#xff08;paired / container&#xff…

前端开发:详细介绍npm、pnpm和cnpm分别是什么,使用方法以及之间有哪些关系

目录 npm、pnpm和cnpm分别是什么 npm pnpm cnpm NPM包管理器 使用npm管理&#xff0c;创建/初始化项目 修改npm镜像&#xff08;npm源设置&#xff09; 基本命令 安装依赖项 下载特定版本的依赖 下载开发依赖 下载全局依赖&#xff08;全局安装&#xff09; 升级依赖项 根据依赖…

我们为你连接网络,安装驱动程序

Windows 11 家庭版/专业版在安装时默认要求联网&#xff0c;其实可以跳过。在这个联网界面按下 Shift F10 打开命令行。输入以下命令并回车&#xff1a;OOBE\BYPASSNRO系统会自动重启&#xff0c;回到联网界面。这时会多出一个 “我没有 Internet” 选项&#xff0c;点它&…

智慧交通夜间逆光误检率↓81.4%!陌讯多模态融合算法在主干道监测的落地优化

一、智慧交通视觉检测的行业痛点智慧交通作为城市基建的核心环节&#xff0c;其视觉检测系统&#xff08;车辆识别、车牌匹配、交通事件预警&#xff09;的可靠性直接影响通行效率与交通安全。但根据《2023 年中国智慧交通发展报告》数据&#xff0c;当前主流方案仍面临三大核心…

Java和数据库的关系

数据库本身是一个独立的、巨大的知识领域&#xff0c;但“数据库的使用、优化和深度理解”绝对是Java后端工程师进阶的核心组成部分。 它们不是分开的&#xff0c;而是紧密耦合、相辅相成的关系。你可以这样理解&#xff1a; 数据库&#xff08;MySQL, Oracle等&#xff09; 就…

Socket some functions

setsockopt 简介setsockopt 是用于设置套接字&#xff08;socket&#xff09;选项的系统调用函数&#xff0c;允许用户对套接字的行为进行精细控制。通过调整选项参数&#xff0c;可以优化网络通信性能、修改超时设置、启用特殊功能等。该函数在 POSIX 系统和 Windows 平台均有…

玩转深度学习数据填补!CNN-GRU组合模型数据填补(四个案例数据)

这两段MATLAB代码&#xff08;BABJ.m 和 CNN_GRUQSTB.m&#xff09;分别完成数据预处理与缺失值标识和基于CNN-GRU混合神经网络的缺失值预测填补任务。以下是详细分析&#xff1a; 一、主要功能 BABJ.m • 功能&#xff1a;从多个Excel文件中读取数据&#xff0c;匹配并合并多个…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的营销创新研究——以“种草”实践践行“以人为本”理念

摘要&#xff1a;本文聚焦于营销本质&#xff0c;强调创造和维护与消费者有价值关系的重要性&#xff0c;指出企业需回归消费者视角提供有价值产品和服务。深入探讨“种草”作为科特勒“以人为本”理念在中国市场的最佳实践&#xff0c;分析其意义与价值。同时&#xff0c;引入…

基于SpringBoot+Vue的智能停车场管理系统 停车管理小程序

&#x1f525;作者&#xff1a;it毕设实战小研&#x1f525; &#x1f496;简介&#xff1a;java、微信小程序、安卓&#xff1b;定制开发&#xff0c;远程调试 代码讲解&#xff0c;文档指导&#xff0c;ppt制作&#x1f496; 精彩专栏推荐订阅&#xff1a;在下方专栏&#x1…

01数据结构-归并排序和计数排序

01数据结构-归并排序和计数排序1.归并排序1.1归并排序概述1.2归并排序的执行流程1.2.1递(分裂)的过程1.2.2归(合并)的过程1.3归并排序的代码实现2.计数排序2.1算法思想2.2计数排序的改进2.2.1优化12.2.2优化21.归并排序 1.1归并排序概述 归并排序&#xff0c;其排序的实现思想…

SQL注入2----(sql注入数据类型分类)

一.前言本章节我们来讲解一下sql注入的分类&#xff0c;主要分为四类&#xff0c;数字型、字符型、搜索型、xx型。二.数字型数字型注入的时候&#xff0c;是不需要考虑单\双引号闭合问题的&#xff0c;因为sql语句中的数字是不需要用引号括起来的&#xff0c;如下mysql> sel…

Elasticsearch Rails 实战全指南(elasticsearch-rails / elasticsearch-model)

一、背景与生态总览 elasticsearch-rails&#xff1a;面向 Rails 的“伴生库”&#xff0c;为 Rails 项目带来 Rake 任务、日志埋点、模板等特性。elasticsearch-model&#xff1a;把 ES 能力“混入”到 Ruby 模型&#xff08;ActiveRecord/Mongoid&#xff09;&#xff0c;提供…

第三阶段数据库-2:数据库中的sql语句

1_数据库操作&#xff08;1&#xff09;注释&#xff1a;-- 单行注释 /**/ 多行注释&#xff08;2&#xff09;创建数据库&#xff1a;create database 数据库名-- create database 数据库名 create database db_first;(3&#xff09;查询数据库&#xff1a;if exsists(select…

python中的filter函数

目录 定义与参数说明 特点 使用场景 常用操作 筛选偶数 去除空字符串 筛选正数 筛选字典 配合集合与元组 注意事项 定义与参数说明 filter函数是Python内置的高阶函数之一&#xff0c;用于筛选可迭代对象中的元素&#xff0c;根据返回值的布尔结果&#xff08;True 或…

BERT(Bidirectional Encoder Representations from Transformers)模型详解

一、BERT 简介BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由 Google 在 2018 年提出的一种预训练语言表示模型。它基于 Transformer 编码器结构&#xff0c;首次提出了 双向上下文建模 的方法&#xff0c;大幅度提升了自然语言处理…

【开题答辩全过程】以 基于Springboot+微信小程序的网上家教预约系统的设计与实现-开题为例,包含答辩的问题和答案

个人简介&#xff1a;一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧…

课小悦系列智能耳机上市,用硬核科技为教育赋能

在人工智能与教育深度融合的浪潮中&#xff0c;深圳课小悦科技有限公司以“智慧教育专家”的姿态崭露头角。这家深耕智能教育硬件的创新企业&#xff0c;于2025年8月正式推出革命性产品H360PRO系列教考耳机&#xff0c;为语言学习场景提供颠覆性解决方案。创新基因&#xff1a;…

[react] class Component and function Component

我对react的用法理解还一直停留在多年以前&#xff0c;说明这段时间我没有更新react的知识。我大脑中记得还是使用Class Component this.setState&#xff0c;可是今天看了看react的文档&#xff0c;发现怎么不一样了&#xff0c;用的都是function useState的方式了。你知道这…

以太坊智能合约地址派生方式:EOA、CREATE 和 CREATE2

1. 引言 在以太坊上&#xff0c;智能合约可以通过以下三种方式之一进行部署&#xff1a; 1&#xff09;由外部账户&#xff08;Externally Owned Account, EOA&#xff09;发起交易&#xff0c;其中 to 字段设为 null&#xff0c;而 data 字段包含合约的初始化代码。2&#x…