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

麻花痒  金牌会员 | 2024-6-25 15:55:47 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 914|帖子 914|积分 2742

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
  1. #pragma once
  2. #include <cstdint>
  3. #include <string>
  4. namespace cutl
  5. {
  6.     /**
  7.      * @brief Endianness type.
  8.      *
  9.      */
  10.     enum class endian
  11.     {
  12.         /** little endian */
  13.         little,
  14.         /** big endian */
  15.         big,
  16.     };
  17.     /**
  18.      * @brief Get the program endianness.
  19.      *
  20.      * @return endian the program endianness.
  21.      */
  22.     endian endian_type();
  23.     /**
  24.      * @brief Byteswap a 16-bit value.
  25.      *
  26.      * @param value the value to byteswap.
  27.      * @return uint16_t the byteswapped value.
  28.      */
  29.     uint16_t byteswap(uint16_t value);
  30.     /**
  31.      * @brief Byteswap a 32-bit value.
  32.      *
  33.      * @param value the value to byteswap.
  34.      * @return uint32_t the byteswapped value.
  35.      */
  36.     uint32_t byteswap(uint32_t value);
  37.     /**
  38.      * @brief Byteswap a 64-bit value.
  39.      *
  40.      * @param value the value to byteswap.
  41.      * @return uint64_t the byteswapped value.
  42.      */
  43.     uint64_t byteswap(uint64_t value);
  44.     /**
  45.      * @brief Byteswap an array of bytes.
  46.      *
  47.      * @param data the array of bytes to byteswap.
  48.      * @param size the size of the array.
  49.      */
  50.     void byteswap(uint8_t *data, uint32_t size);
  51. } // namespace cutl
复制代码
3. sysutil.cpp
  1. #include <map>
  2. #include <iostream>
  3. #include <strutil.h>
  4. #include <cstdlib>
  5. #include "sysutil.h"
  6. #include "inner/logger.h"
  7. #include "inner/system_util.h"
  8. #include "inner/filesystem.h"
  9. namespace cutl
  10. {
  11.     endian endian_type()
  12.     {
  13.         int a = 1;
  14.         int *p = &a;
  15.         uint8_t *pBtye = (uint8_t *)p;
  16.         if (*pBtye == 1)
  17.         {
  18.             return endian::little;
  19.         }
  20.         else
  21.         {
  22.             return endian::big;
  23.         }
  24.     }
  25.     uint16_t byteswap(uint16_t value)
  26.     {
  27.         auto data = (uint8_t *)(&value);
  28.         byteswap(data, 2);
  29.         return value;
  30.     }
  31.     uint32_t byteswap(uint32_t value)
  32.     {
  33.         auto data = (uint8_t *)(&value);
  34.         byteswap(data, 4);
  35.         return value;
  36.     }
  37.     uint64_t byteswap(uint64_t value)
  38.     {
  39.         auto data = (uint8_t *)(&value);
  40.         byteswap(data, 8);
  41.         return value;
  42.     }
  43.     void byteswap(uint8_t *data, uint32_t size)
  44.     {
  45.         uint32_t n = size / 2;
  46.         for (uint32_t i = 0; i < n; i++)
  47.         {
  48.             uint8_t temp = data[i];
  49.             data[i] = data[size - i - 1];
  50.             data[size - i - 1] = temp;
  51.         }
  52.     }
  53. } // namespace cutl
复制代码
4. 测试代码

[code]#include "common.hpp"#include "sysutil.h"void TestEndian(){    PrintSubTitle("TestEndian");    if (cutl::endian_type() == cutl::endian::little)    {        std::cout
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表