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]