酝垓 发表于 2025-6-4 09:56:17

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)存储在内存的最高地址。最高有效字节存储在最低地址
又称:网络字节序内存地址:高 -> 低
存储内容:0x340x12小端数据的最低有效字节(Least Significant Byte, LSB)存储在内存的最低地址,而最高有效字节(Most Significant Byte, MSB)存储在内存的最高地址。最低有效字节存储在最低地址
又称:主机字节序内存地址:高 -> 低
存储内容:0x120x34实现原理:
通过高低地址位的数据判断大端或小端。
应用场景:

[*]网络传输协议中,大端和小端的字节序不同,需要转换为网络字节序。
[*]不同平台的数据交换,需要转换为统一的字节序。
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 cutl3. 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;
            data = data;
            data = temp;
      }
    }
} // namespace cutl4. 测试代码

#include "common.hpp"#include "sysutil.h"void TestEndian(){    PrintSubTitle("TestEndian");    if (cutl::endian_type() == cutl::endian::little)    {      std::cout
页: [1]
查看完整版本: C++系统相关操作7 - 判断系统大小端&大小端的数据转换