利用cmake和模板编程进行字节序转换

这篇具有很好参考价值的文章主要介绍了利用cmake和模板编程进行字节序转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

想利用模板编程进行编译期计算,想先判断主机字节序然后利用std::enable_if(C++17使用if constexpr)根据字节序是大端还是小端来判断是否进行字节序转换。但第一步编译期判断字节序不成功,因为union类型不能constexpr, 起对成员的选择访问是运行时的;而又不想运行时判断,所以要用其它方法代替。首先gcc编译器是有定义宏,考虑到平台扩展性还是选用了cmake的功能。
另外我做的是本机字节序往网络字节序的互转,因此只有判断是否是大端字节序,如果本机是大端则直接return,本机是小端则转换。

cmake字节序判断

cmake提供了判断字节序的功能,在cmake 3.20之前是TestBigEndian,之后由CMAKE_BYTE_ORDER替代,官方文档:
TestBigEndian
Deprecated since version 3.20: Supserseded by the CMAKE
_BYTE_ORDER variable.
Check if the target architecture is big endian or little endian.
test_big_endian
test_big_endian()
Stores in variable either 1 or 0 indicating whether the target architecture is big or little endian.
用法如下:

    if (CMAKE_CXX_BYTE_ORDER STREQUAL "BIG_ENDIAN")
        set(IS_BIG_ENDIAN_TARGET 1)
    else()
        set(IS_BIG_ENDIAN_TARGET 0)
    endif()
else()
    include(TestBigEndian)
    test_big_endian(BIG_ENDIAN)
    set(IS_BIG_ENDIAN_TARGET ${BIG_ENDIAN})
endif()

然后利用configure_file把IS_BIG_ENDIAN_TARGET传入代码中,或用add_definition(-DIS_BIG_ENDIAN_TARGET=1(or 0))

configure_file(${PROJECT_SOURCE_DIR}/include/common/config.h.in
    ${PROJECT_BINARY_DIR}/include/common/config.h)

# 注意后面要target_include_directories里指定这个路径
// config.h.in
#ifndef CONFIG_H
#define CONFIG_H

#ifndef IS_BIG_ENDIAN_TARGET
#define IS_BIG_ENDIAN_TARGET @DIS_BIG_ENDIAN_TARGET@
#endif

#endif

模板编程进行字节序转换

    template <class T>
    static std::enable_if_t<!IS_BIG_ENDIAN_TARGET && (sizeof(T) > 1), void>
    AdjustEndianness(T& value) {
        uint8_t* value_begin = reinterpret_cast<uint8_t*>(&value);
        std::reverse(value_begin, value_begin + sizeof(T));
    }

    template <class T>
    static std::enable_if_t<IS_BIG_ENDIAN_TARGET || (sizeof(T) == 1), void>
    AdjustEndianness(T& value) {
        return;
    }

    template <class T>
    static void AdjustVarsEndianness(T&& value) {
        AdjustEndianness(std::forward<T>(value));
    }

    template <class T, class ...ArgTypes>
    static void AdjustVarsEndianness(T&& value, ArgTypes&&... args) {
        AdjustEndianness(std::forward<T>(value));
        AdjustVarsEndianness(std::forward<ArgTypes>(args) ...);
    }

这里只有在本机字节序和网络字节序不一致且T的size大于1时才转换字节序,因为我这个场景时通过网络发送信息,保证client和server端解析不会出错文章来源地址https://www.toymoban.com/news/detail-440426.html

到了这里,关于利用cmake和模板编程进行字节序转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 利用matlab进行传递函数与状态空间表达式的相互转换

    利用matlab进行传递函数与状态空间表达式的相互转换 (1)由传递函数变换为状态空间表达式  输入如下代码,num为传递函数表达式的分子,den为传递函数的分母(也就是状态矩阵A的特征值),数字是依次为s的高次项系数降序排列。  运行结果可得状态空间方程。A为状态矩

    2024年02月11日
    浏览(66)
  • Linux网络编程:IP地址的字符串与网络字节序转换:inet_addr()、inet_aton()、inet_ntoa()、inet_pton()、inet_ntop()

    IP地址的字符串与网络字节序转换 向sockaddr_in注入地址时,需要将ip地址的字符串形式转化为网络字节序的形式;而相反地,网络字节序也能转化回字符串形式。用到的函数分别inet_addr()、inet_aton()、inet_ntoa()、inet_pton()、inet_ntop(),转化的方向如下图。 1 inet_addr() 功能:是将一

    2024年02月03日
    浏览(45)
  • 数据挖掘题目:根据规则模板和信息表找出R中的所有强关联规则,基于信息增益、利用判定树进行归纳分类,计算信息熵的代码

    S∈R,P(S,x )∧ Q(S,y )== Gpa(S,w ) [ s, c ] 其中,P,Q ∈{ Major, Status ,Age }. Major Status Age Gpa Count Arts Graduate Old Good 50 Arts Graduate Old Excellent 150 Arts Undergraduate Young Good 150 Appl_ science Undergraduate Young Excellent Science Undergraduate Young Good 100 解答: 样本总数为500,最小支持数为5

    2024年02月06日
    浏览(48)
  • cmake stm32 模板

    mingw cmake gcc-arm-none-eabi-gcc 并添加环境变量 文件结构 ├─Bsp │ ├─driver_time │ └─driver_uart ├─cmake ├─Component │ └─Fifo ├─Driver │ ├─Inc │ └─Src ├─Lib │ ├─CMSIS │ │ ├─Core │ │ │ └─Include │ │ └─Device │ │ └─ST │ │ └─STM32F7xx │ │ └─Includ

    2024年02月11日
    浏览(26)
  • MFC : 多字节、宽字节等之间的数据类型转换

    目录 ATL 模板宏 W2A 转多字节 A2W 转宽字节 A2T 转 CString T2A 转 char * TEXT 宏定义 CString 转换 int 转 CString double 转 CString CString 转 double CString 转换 string 宽字符串转换 WideCharToMultiByte BSTR 转换 string DWORD LPCSTR 长指针常量字符串 LPCWSTR 常量宽字符指针 T2W 转换多字节 char * A2CW 转换多字

    2023年04月20日
    浏览(29)
  • c++ | 字节转换 | 字长 | 机器位数

    为什么有的时候脑子转不过来?? 为什么要对字节、机器长啊、位啊都要门清 位数 一般的就是指计算机的位数,比如64位/32位,更简单的理解,计算机就是在不停的做二进制的计算,比如32位计算机,在长度为32的二进制数字串上进行计算 一般的 int 整数类型 长度 4字节 32位

    2024年02月12日
    浏览(34)
  • CMake引用QT、CMake构建一个转换为3d tile的开源代码

    在CMake里单独运行一下  find_package(Qt5     REQUIRED    COMPONENTS Core Xml Test) ,Core Xml Test 这三个是需要的qt组件; 情况如下;提示找不到QT; 根据资料,cmake引用qt需要3-4个方面,     首先Qt包含三个编译工具:moc、uic、rcc, moc:元对象编译器(Meta Object Compiler),用来处理带有

    2024年02月05日
    浏览(35)
  • 2022-03-31 Amr-nb格式字节对齐、非字节对齐的转换和解码处理(含源码)

    AMR的格式分为AMR-NB、AMR-WB、AMR-WB+ 三种格式的区分和差异可以自行百度,在这里就不做细分了。 我相信,找到这篇文章的基本已经是入门了。 这一次我们主要处理的是AMR-NB格式的数据。本文主要贴出了如何区分字节对齐、非字节对齐的方法,以及如何处理解码?( 需要完整

    2024年02月02日
    浏览(33)
  • 【Python】【OpenCV】【NumPy】图像和原始字节的转换

    学习完基础的图像算法,开始接触OpenCV学习: 灰度图中,一个像素点上的灰度级需要一个字节(byte,2^8,8 bit)进行存储,此时的灰度图是二维的。 而当我们需要转换为彩色图时,即三维,便会产生颜色通道(Channel),这个时候,一个像素点上的灰度级便会需要三个字节来

    2024年02月05日
    浏览(35)
  • Windows环境利用QT+CMake编译mingw版本的opencv

    Opencv官网没有提供mingw版本的opencv库,所以需要自己编译,下面是编译过程,32位64位方法类似。 可以直接下载编译好的mingw版本opencv4.4: 使用CMAKE3.22+QT5.13编译后的opencv4.4(32位的)资源-CSDN文库 如果网络不好,可能会需要自己手动下载下面的文件:  opencv_videoio_ffmpeg.dll+ope

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包