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. 测试代码
[code]#include "common.hpp"#include "sysutil.h"void TestEndian(){ PrintSubTitle("TestEndian"); if (cutl::endian_type() == cutl::endian::little) { std::cout |