Есть некий бинарный файл, хранит 32битные значения (signed и unsigned) и ascii строки. Как-то попадает в память (может ifstream::read, или mmap). Вопрос в том, как их него правильно читать значения не нарвавшись на undefined behavior, а желательно - и на implementation-specific behavior.
Для начала, просто unsigned и строки.
Вобщем-то, вопрос сводится к тому, в каком типе хранить данные. С одной стороны, тот же ifstream::read возвращает char*. С другой, std::string конструируется также из char*. Но с третьей, чтобы безопасно кросс-платформенно читать инты (побайтовое чтение + сдвиги + OR), нужен беззнаковый тип, потому что сдвиг знакового ЕМНИП UB. Каст знакового в беззнаковое, опять таки ЕМНИП, implementation defined. Остаётся только касты между unsigned char* и char*, что с ними - будет ли ub или implementation-defined? Если будет, что делать? Я больше вариантов не вижу.
Ну а с unsigned, как я понимаю, всё совсем сложно, ибо потенциально они могут быть представлены как-то иначе чем в дополнительном коде, значит из байтов их напрямую собирать нельзя (но в файле они в обычном дополнительном коде).