ivan
написал 14 ноября 2004 года в 18:33 (1180 просмотров)
Ведет себя
неопределенно; открыл 4 темы в форуме, оставил 21 комментарий на сайте.
Есть маленькая проблемка:
считываю из бинарного файла четыре байта
unsigned int buf;
fread(&buf,1,4,file_d);
всё хорошо да вот незадачка число которое считывается в переменную buf
оказывается перевёрнутым задом наперёд.
Почему так происходит?
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
А откуда этот файл взялся?
Надо полагать что не с твоего компа .. если ты запишешь файл с помощью fwrite а потом прочитаешь fread’ом то тако проблемы не появиться ..
У меня такая проблема возникала когда я получал целые числа из сети .. лечиться функциями htonl , ntohl и компанией ..
Преобразование big endian в little endian и наоборот делается прще и быстрее с помощью побитовых операций.
Интересно… А если попробовать read(), то есть не буферизировать, хотя вряд ли, что изменится, но все же…
Если ты посмотришь исходный код htonl htons, то выяснишь что именно так он и делает, если архитектура не поддерживает переворот одной командой. Кстати перевернуть double битовыми операциями оказалось не тревиальной задачей , мне так и не удалось, хотя с помощью тупого цикла без проблем.
Вообще я склоняюсь к мнению что весь геморой происходит из за
расположения в памяти младших и старших битов. т.к. происходит такая вот фенька: при считывании числа 0×0000153c я получаю 0×3c150000. Преобразовать это к нормальному виду не сложно даже и без цикла, я например делаю так: unsigned char *a = (unsigned char*)chislo; а дальше просто переставляю отдельные байты числа как элементы массива.
И всё бы как в счастливой сказке, но вот только на разных аппаратных платформах расположене старших и младших битов в памяти разное,
а так хочется чобы моя программа была переносимой.
Вот для этого и существуют функции htonl, htons, ntohs, htohs, которые на разных платформах определены по разному. Если перед записью ты преобразуешь порядок байтов хоста в сетевой (htonl) и после считывания обратно (ntohl), то твоя прога будет абсолютно переносима.