从大端转换为小端 C++

convert from big to little endian c++

本文关键字:C++ 转换      更新时间:2023-10-16

我正在做一个家庭作业,打印出intfloat的大端和小端值。我在转换为小端序时遇到问题。

这是我的代码

void convertLitteE(string input)
{
    int theInt;
    stringstream stream(input);
    while(stream >> theInt)
    {
        float f = (float)theInt;
        printf("n%dn",theInt);
        printf("int:   0x");
        printLittle((char *) &theInt, sizeof(theInt));
        printf("nfloat: 0x");
        printLittle((char *) &f, sizeof(f));
        printf("nn");
    }
}
void printLittle(char *p, int nBytes)
{
    for (int i = 0; i < nBytes; i++, p++)
    {
        printf("%02X", *p);
    }
}

当输入为 12 时,我得到我所期望的

output:
int:   0x0C000000
float: 0x00004041

但是当输入为 1234 时

output:
int:   0xFFFFFFD20400000
float: 0x0040FFFFFFF9A44

但我会期待

int :  0xD2040000
float: 0x00409A44

当我逐步完成for循环时,我可以看到似乎有垃圾值的位置,然后它打印了所有F,但我不知道为什么。我已经尝试了很多不同的方法,但我无法让它工作。

任何帮助将不胜感激。

显然在您的系统上,char是有符号的8位类型。 使用无符号的 8 位字节,1234 的 4 字节小端表示形式将0xd2, 0x04, 0x00, 0x00 。 但是,当在大多数系统上解释为已签名的char时,0xd2变得-0x2e

然后调用 printf 将该char提升到具有值 -0x2eint,然后printf(不是很类型安全)在您传递intunsigned int中读取。 这是未定义的行为,但在大多数系统上,它将与 static_cast 相同,因此您在尝试打印第一个字节时会得到0xFFFFFFD2的值。

如果您坚持在这些函数中使用unsigned char而不是char,则可以避免此特定问题。

(但正如@jogojapan指出的那样,这整个方法根本不是可移植的。