htonl без использования сетевых заголовков - PullRequest
0 голосов
/ 04 мая 2018

Мы пишем код встроенного приложения и проверяем строку на допустимый формат IPv4. Я успешно смог сделать это с помощью строкового токенизатора, но теперь мне нужно преобразовать целые числа в порядок Host-To-Network с помощью функции htonl ().

Поскольку это встроенное приложение, я не могу включить сетевой заголовок и библиотеку только для использования функции htonl ().

Есть ли какой-либо способ / не сетевой заголовок в C ++, с помощью которого я могу использовать функциональность htonl ()?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Тебе не нужен htonl. Если у вас есть IP-адрес в виде отдельных байтов, как это:

uint8_t a [4] = { 192, 168, 2, 1 };

Вы можете просто отправить эти 4 байта в точном порядке по сети. Это если вам не нужно 4-байтовое целое число, чего, скорее всего, нет, поскольку вы, вероятно, не используете sockaddr_in & friends.

Если у вас уже есть адрес в виде 32-битного целого в порядке байтов хоста, вы можете получить a следующим образом:

uint32_t ip = getIPHostOrder();
uint8_t a [4] = { (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF };

Это имеет то преимущество, что не полагается на поведение, определенное реализацией, и является переносимым.

0 голосов
/ 04 мая 2018

Из справочной страницы htonl():

Функция htonl () преобразует целое число без знака hostlong из байтового порядка хоста в сетевой байтовый порядок.

Порядок сетевых байтов на самом деле просто порядковый номер.

Все, что вам нужно сделать, - это написать (или найти) функцию, которая преобразует целое число без знака в старшее число и использовать его вместо htonl. Если ваша система уже в порядке с прямым порядком байтов, вам вообще ничего не нужно делать.


Вы можете использовать следующее для определения порядка в вашей системе:

int n = 1;
// little endian if true
if(*(char *)&n == 1) {...}

Источник


И вы можете преобразовать немного порядковый номер uint32_t в порядковый номер, используя следующее:

uint32_t htonl(uint32_t x) {
    unsigned char *s = (void *)&x;
    return (uint32_t)(s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3]);
}

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...