簡體   English   中英

從大尾數轉換為小尾數c ++

[英]convert from big to little endian c++

我正在做一個作業,以打印intfloat順序。 我在轉換為小字節序時遇到麻煩。

這是我的代碼

void convertLitteE(string input)
{
    int theInt;
    stringstream stream(input);
    while(stream >> theInt)
    {
        float f = (float)theInt;

        printf("\n%d\n",theInt);
        printf("int:   0x");
        printLittle((char *) &theInt, sizeof(theInt));

        printf("\nfloat: 0x");
        printLittle((char *) &f, sizeof(f));
        printf("\n\n");
    }
}

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 (不是很安全的類型)讀取一個unsigned int ,您將int傳遞給了int 這是未定義的行為,但是在大多數系統上,它與static_cast相同,因此在嘗試打印第一個字節時,您將獲得值0xFFFFFFD2

如果您在這些函數中堅持使用unsigned char而不是char ,則可以避免此特定問題。

(但正如@jogojapan指出的那樣,整個方法根本無法移植。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM