首页 > 解决方案 > 为什么字符数组不给出无符号结果

问题描述

在这个项目中,我应该接收一个数据包,并将其中的一部分转换为一个无符号整数并获得 Big-Endian 和 Little-Endian 结果。最初,我只想将字节数组(数据包)内的指针转换为无符号整数类型,该类型会自动将接收到的值放入 Big-Endian 形式,就像(uint32_be_t*)packet;它在执行时自动放入 Little-Endian 形式的方式一样(uint32_t*)packet.

由于找不到自动执行此操作的类型,因此我决定创建自己的结构,称为“u32”,该结构具有“get”方法,该方法以 Big-Endian 形式获取值,“get_le”获取Little-Endian 形式的值。但是,我注意到当我这样做时,我会从 Little-Endian 结果中得到一个否定的结果。

struct u32 {
    u8 data[4] = {};

    uint32_t get() {
        return ((uint32_t)data[3] << 0)
            | ((uint32_t)data[2] << 8)
            | ((uint32_t)data[1] << 16)
            | ((uint32_t)data[0] << 24);
    }
    
    uint32_t get_le() {
        return ((uint32_t)data[3] << 24)
            | ((uint32_t)data[2] << 16)
            | ((uint32_t)data[1] << 8)
            | ((uint32_t)data[0] << 0);
    }
};

为了模拟一个数据包,我只是创建了一个字符数组,然后像这样将一个 u32* 转换为它:

int main() {
    char ary[] = { 0x00, 0x00, 0x00, (char)0xF4 };
    u32* v = (u32*)ary;    
    printf("%d %d\n", v->get(), v->get_le());
    return 0;
}

但后来我得到了结果:244 -201326592

为什么会这样?“get_le”的返回类型是 uint32_t,第一个函数“get”应该返回 Big-Endian 无符号整数,它执行正确。

作为旁注,这只是一个突然出现在我脑海中的测试,所以我去图书馆在类之间测试它,但不幸的是,这意味着我必须使用在线编译器(onlinegdb),但我认为它会在 Visual Studio 中工作相同。此外,如果您对如何改进我的代码有任何建议,我们将不胜感激。我正在使用 Visual Studio 2019 并且允许使用 cstdlib。

标签: c++arraysc

解决方案


%u好吧,我敢说你不想%d在那个printf()格式字符串中使用!

%d假设该值是有符号的,所以如果最高有效位是1你得到一个减号。


推荐阅读