C/C++ 大小端判断以及字节转int

使用 union 和函数来判断大小端字节序,并将字节数组转换为整数

1.union 结构允许在相同的内存位置存储不同类型的数据,这里使用 union 将一个 16 位的整数和一个 8 位的字节数组共享同一段内存。
2.通过初始化 value 成员为 0x0102,我们在 bytes 数组中存储了这个 16 位整数的字节表示。
3.isLittleEndian() 函数根据 bytes 数组的第一个字节判断当前平台的字节序,并返回对应的结果。
4.int byteArrayToInt(const unsigned char* data, int length) 函数根据当前平台的字节序,将输入的字节数组转换为对应的整数值。使用位移操作和位或运算来逐步构建整数。
5.int byteArrayToInt(const unsigned char* data, int length, bool isLittleEndian) 函数根据输入data的字节序和bool值,将输入的字节数组转换为对应的整数值。使用位移操作和位或运算来逐步构建整数。

#include 
#include 

union EndiannessUnion{
    uint16_t value;
    uint8_t bytes[2];
} static const TARGET_ENDIANNESS = {.value = 0x0102};

int isLittleEndian() {
    return TARGET_ENDIANNESS.bytes[0] == 0x02;
}

/* 与系统大小端序挂钩 */
int byteArrayToInt(const unsigned char* data, int length) {
    int result = 0;
    int shift = 0;

    if (isLittleEndian()) {
        for (int i = length - 1; i >= 0; i--) {
            result = (result << 8) | data[i];
        }
    } else {
        for (int i = 0; i < length; i++) {
            result = (result << 8) | data[i];
        }
    }

    return result;
}

/* 与输入data大小端序挂钩 */
int byteArrayToInt(const unsigned char* data, int length, bool isLittleEndian) {
    int result = 0;
    int shift = 0;

    if (isLittleEndian) {
        for (int i = length - 1; i >= 0; i--) {
            result = (result << 8) | data[i];
        }
    } else {
        for (int i = 0; i < length; i++) {
            result = (result << 8) | data[i];
        }
    }

    return result;
}

/* easy test  */
int bytes4AsInt(unsigned char *src){
    return (int)( src[0] << 24| src[1] << 16 | src[2] << 8 ) | (src[3]);
}

int main(){

    std::cout << "isLittleEndian:" << isLittleEndian() << std::endl;

    int i = 443;/* 小端存储 : BB 01 00 00  低地址 -> 高地址 */
    unsigned char *data = ( unsigned char *)&i;
    std::cout << "to int:" << byteArrayToInt(data, 4) << std::endl; /* 结果 443 */

    unsigned char data1[4] = {0xBB,0x01,0x00,0x00}; /* 小端序存储 */
    std::cout << "to int:" << byteArrayToInt(data1, 4, true) << std::endl; /* 结果 : 443 */

    unsigned char data2[4] = {0x00,0x00,0x01,0xBB}; /* 大端序存储 */
    std::cout << "to int:" << byteArrayToInt(data2, 4, false) << std::endl; /* 结果 :443 */

    return 0;
}

output:

[root@jn cpp]# g++ Endian.cpp
[root@jn cpp]# ./a.out
isLittleEndian:1
to int:443
to int:443
to int:443
[root@jn cpp]#

你可能感兴趣的:(c++,c语言,算法)