Uruchomiłem następujący program na maszynie Little-Endian [LE] [Linux, procesor Intel]. Nie jestem w stanie wyjaśnić 3 wyników w poniższym fragmencie kodu. Ponieważ maszyna jest LE, wartość a
jest przechowywana jako 0x78563412
. Podczas drukowania wyświetla rzeczywistą wartość. Ponieważ jest to maszyna LE, oczekuję, że ntohl()
będzie operacją "no-op" i wyświetlą ją 0x78563412
. Oczekuję jednak, że 0x12345678
dla drugiej deklaracji wydruku zawierającej htonl()
. Czy ktoś może mi pomóc zrozumieć, dlaczego są one takie same?To samo wyjście dla htonl() i ntohl() na liczbach całkowitych
int main()
{
int a = 0x12345678;
printf("Original - 0x%x\n", (a));
printf("Network - 0x%x\n", htonl(a));
printf("Host - 0x%x\n", ntohl(a));
return 0;
}
wyjściowa:
Original - 0x12345678
Network - 0x78563412
Host - 0x78563412
Jak wspomniano poniżej, poniżej oczekiwałem, że następujące zachowanie zawsze będzie prawdziwe: 'x == htonl (ntohl (x))'. Ale tak się nie dzieje i twoje wyjaśnienie było bardzo pomocne. – Bhaskar
@Bhaskar: Punkt Briana Roacha jest również ważny, a następnie: nigdy nie obliczałeś 'htonl (ntohl (a))'. Obliczono 'htonl (a)' i 'ntohl (a)'. –
dziękuję bardzo! Doskonałe wyjaśnienie – Skully