Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > uint16_t и переносимость


Автор: afx33sd 20.8.2013, 10:38
У меня есть структура, например такая:
Код

struct {
          uint32_t ip;    
          uint16_t port;                                    
}

Структура не упакованная. Вопрос в том, будет ли она она переносима на различные платформы (вопрос о big/little-endian). Меня смущает тип uint16_t.
Хочу сделать это структуру ключом для map. Думаю, если упаковывать, то придется морочиться с big/little endian, а этого не хочется.

Автор: SenkraD 20.8.2013, 10:48
Я так понимаю, что это внутренняя структура, которая нужна для хранения настроек и которую не будут передавать по сети в виде последовательности байтиков, ведь так? если да, то не вижу никаких проблемм. если нужно передавать ее по сети, то пишите сериализацию/дезериализацию или возьмите готовую, главное ее по сети не передавать, как в примере ниже:
Код

send(_socket, &config, sizeof(config))

так как так у вас появятся проблеммы при передаче между разными платформами

Автор: feodorv 20.8.2013, 10:57
Цитата(afx33sd @  20.8.2013,  11:38 Найти цитируемый пост)
будет ли она она переносима на различные платформы (вопрос о big/little-endian)

Всё зависит от того, будете вы экземпляры этой структуры гонять по сети или сохранять на диск ("как есть"). Если нет - то какие проблемы?

Цитата(afx33sd @  20.8.2013,  11:38 Найти цитируемый пост)
то придется морочиться с big/little endian

А то, что у Вас размер структуры не выровнен, это Вас не смущает? Вместо uint16_t для номера порта можно использовать uint32_t, тогда смущение типом uint16_t пропадёт))) Да и ключ для map более правильный будет...

Всё-таки, опишите задачу поподробнее. IP/port намекает, что в крайнем случае эту пару всегда можно хранить в сетевом порядке байт.

Автор: afx33sd 20.8.2013, 11:35
Передавать не буду, нужно чтобы была переносимость между платформами.
Как я понимаю uint16_t - это не то же самое, что unsigned a:16, то есть все в порядке. Спасибо.

К реальной задачи пост относится косвенно, хотелось разобраться.
Цитата
Да и ключ для map более правильный будет...

Это почему? И так и так - 4 байта.

Ключ для map достоин отдельной ветки обсуждения: http://forum.vingrad.ru/index.php?showtopic=371322&view=findpost&p=2579158

Автор: feodorv 20.8.2013, 11:53
Цитата(afx33sd @  20.8.2013,  12:35 Найти цитируемый пост)
Это почему? И так и так - 4 байта.

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

Цитата(afx33sd @  20.8.2013,  12:35 Найти цитируемый пост)
Как я понимаю uint16_t - это не то же самое, что unsigned a:16

А какая разница с точки зрения big/little endian или переносимости кода?

Автор: afx33sd 20.8.2013, 13:20
Цитата
нужно просто аккуратно составить функцию сравнения ключей

Это да
Цитата
А какая разница с точки зрения big/little endian или переносимости кода?

Например, для:
Код

uint8_t a:2;
uitn8_t a:6;

битовые поля для little-endian, раздаются с "одного конца" байта, а для big-endian наоборот, собственно для unsigned a:16 аналогично, поправьте если не так

Автор: bsa 20.8.2013, 13:40
afx33sd, если ты не используешь union, то тебе должно быть по барабану.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)