我知道有這個問題的答案使用gcc byteswap和其他替代品在網絡上,但想知道爲什麼我的代碼下面不工作。c + + 64位網絡到主機翻譯
首先我有GCC警告(我覺得不應該推出)和原因,我不希望使用字節交換是因爲我要確定我的機器是big endian還是little endian和使用字節交換因此我。如果我的機器是big endian我可以memcpy字節原樣沒有任何翻譯,否則我需要交換和複製它。
static inline uint64_t ntohl_64(uint64_t val)
{
unsigned char *pp =(unsigned char *)&val;
uint64_t val2 = (pp[0] << 56 | pp[1] << 48
| pp[2] << 40 | pp[3] << 32
| pp[4] << 24 | pp[5] << 16
| pp[6] << 8 | pp[7]);
return val2;
}
int main()
{
int64_t a=0xFFFF0000;
int64_t b=__const__byteswap64(a);
int64_t c=ntohl_64(a);
printf("\n %lld[%x] [%lld] [%lld]\n ", a, a, b, c);
}
Warnings:-
In function \u2018uint64_t ntohl_64(uint64_t)\u2019:
warning: left shift count >= width of type
warning: left shift count >= width of type
warning: left shift count >= width of type
warning: left shift count >= width of type
Output:-
4294901760[00000000ffff0000] 281470681743360[0000ffff00000000] 65535[000000000000ffff]
我有點endian機器上運行此所以字節交換和ntohl_64應該產生完全相同的值,但不幸的是我得到完全意想不到的結果。如果有人能指出什麼是錯的,那將會很棒。
您是否考慮過解決警告? – PlasmaHH
嗨,我不確定爲什麼首先有警告,因爲我的班次恰好適合64位整數,並且不應該有損失 – Shanky
您是否檢查過您正在轉換的是什麼類型? – PlasmaHH