Допустим, у вас есть текст ASCII "BigE" в массиве b
байтов.
b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'
Это сетевой порядок для строки.
Если бы оно рассматривалось как 32-разрядное целое число, оно было бы
'B' + ('i' << 8) + ('g' << 16) + ('E' << 24)
на платформе с прямым порядком байтов и
'E' + ('g' << 8) + ('i' << 16) + ('B' << 24)
на платформе с прямым порядком байтов.
Если вы конвертируете каждую 16-битную работу отдельно, вы не получите ни одного из этих
'i' + ('B' << 8) + ('E' << 16) + ('g' << 24)
, поэтому ntohl
и ntohs
оба требуются.
Другими словами, ntohs
меняет местами байты в 16-битном коде, а ntohl
меняет порядок четырех байтов своего 32-битного слова.