Почему это объявление переменной uint16_t не работает?
Что ж, оно работает ...
Вы, вероятно, на машине с прямым порядком байтов, поэтому результатправильно.
На машине с прямым порядком байтов память выглядит так:
uint16_t v1 = 1; --> Memory: 0x01 0x00
uint16_t v256 = 256; --> Memory: 0x00 0x01
В сетевом порядке это выглядит так:
uint16_t v1 = 1; --> Memory: 0x00 0x01
uint16_t v256 = 256; --> Memory: 0x01 0x00
Так что k
имеет значение 1
, который в памяти будет 0x01 0x00
Тогда op
будет присвоен k
, преобразованный в сетевой порядок, поэтому в памяти он будет 0x00 0x01
.
Когда вы напечатаете это как uint16_t
на хосте, вы увидите результат 256.
Эта маленькая программа иллюстрирует происходящее:
#include <stdio.h>
#include <inttypes.h>
#include <arpa/inet.h>
int main()
{
uint16_t k = 1;
unsigned char* p = (unsigned char*)&k;
printf("k=%hd\n", k);
for (size_t i = 0; i<sizeof k; ++i)
{
printf("%02X\n", *p++);
}
uint16_t op = htons(k);
unsigned char* pop = (unsigned char*)&op;
printf("op=%hd\n", op);
for (size_t i = 0; i<sizeof op; ++i)
{
printf("%02X\n", *pop++);
}
return 0;
}
Выход:
k=1
01
00
op=256
00
01