[英]convert from big to little endian c++
我正在做一個作業,以打印int
和float
順序。 我在轉換為小字節序時遇到麻煩。
這是我的代碼
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
提升為值-0x2e
的int
,然后printf
(不是很安全的類型)讀取一個unsigned int
,您將int
傳遞給了int
。 這是未定義的行為,但是在大多數系統上,它與static_cast
相同,因此在嘗試打印第一個字節時,您將獲得值0xFFFFFFD2
。
如果您在這些函數中堅持使用unsigned char
而不是char
,則可以避免此特定問題。
(但正如@jogojapan指出的那樣,整個方法根本無法移植。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.