LINUX.ORG.RU

Порядок байтов и...


0

2

Берем двоичный big-endian файл и открываем его на little-endian машине. Вопрос если я его побайтно записывал на big-endian системе то побайтное чтение на little-endian системе выдаст мне тотже поток данных что я и записывал?

ЗЫ: меня мучает вопрос а не надоли переставлять местами еще и биты, то есть не будет ли 0x01 читаться как 0x80... Короче ступор, нужно мнение знающих вопрос людей.

Биты не переставляются. Побайтное зфпись/чтение (при условии, что размеры байт равны) на разных архитектурах выдадут одинаковый результат... если, конечно, железяка уж совсем не экзотическая и не обращает битовый порядок :)

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

> Побайтное зфпись/чтение (при условии, что размеры байт равны) на разных архитектурах выдадут одинаковый результат...

Стесняюсь спросить - ты видел, как именно этот персонаж «побайтово записывает»?

tailgunner ★★★★★
()

Коллега, имевший щастье поработать тут на РС и у америкосов на спарках что ли (точно не помню), жалился что задолбался гонять бинарные данные из одного представления в другое. А попробовать?

AIv ★★★★★
()

>если я его побайтно записывал на big-endian системе то побайтное чтение на little-endian системе выдаст мне тотже поток данных что я и записывал?

Конечно. Ты же записывал побайтно, а не пачками байтов вроде интов.

меня мучает вопрос а не надоли переставлять местами еще и биты, то есть не будет ли 0x01 читаться как 0x80...

Если ты вручную собираешь и разбираешь байт, проблем не будет. Если за тебя это делает компилятор из каких-то чисел - вроде бы тоже (не уверен на 100%). А вот если ты формируешь байт структурой из битовых полей, могут вылезти проблемы. Все такие структуры нужно огораживать #ifdef-проверками порядка упаковки битовых полей.

staseg ★★★★★
()
Ответ на: комментарий от tailgunner

> Стесняюсь спросить - ты видел, как именно этот персонаж «побайтово записывает»?

Это уже другой вопрос :)

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

Вот снифером ловим заголовок IP пакета: 45 00 00 40 ae f0 40 00 40 06 fc 32 c0 a8 07 42 c0 a8 07 02

Теперь вопрос: этот вот первый 0x45 на little-endian как я понимаю должен быть 0x54 если посмотреть на формат заголовка: первые 4 бита версия протокола вторые четыре бита длина заголовка. Отсюда вопрос: почему поля местами переставлены но значения в них стоят правильные?

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

Уважаемый, ознакомьтесь пожалуйста с понятиями big/little-endian, и только потом задавайте вопросы.

Jetty ★★★★★
()

Вопрос теоретический или нужно сделать портабельные структуры? Если первое, то важен только порядок байтов. Если второе, то Google Protobuf, Apache Thrift

vertexua ★★★★★
()
Ответ на: комментарий от Jetty

Я конечно не спорю что есть какие-то диковинные адово кастомные архитектуры, у которых еще и битовое представление может «вертеться»... Но причем тут это к обычному IP невкуриваю...

Jetty ★★★★★
()
Ответ на: комментарий от mskmsk1985

> первые 4 бита версия протокола вторые четыре бита длина заголовка.

45(hex) = 0100 0101

первые 4 бита равны 0100, что является цифрой 4 (версия протокола).
Вторые 4 бита равны 0101 - это цифра 5. Что не так?

на little-endian как я понимаю должен быть 0x54

НЕТ! big/little endian не влияет на порядок бит. Болько на порядок байт.

Slavaz ★★★★★
()

Чуваки, данные ведь по сети передаются только как litle-endian.
На той стороне они же обратно не разворачиваются.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Slavaz

Я как существо «разумное» биты нумерую в мозгу с LSB к MSB (справа на лево), а в описании TCP/IP нумерация в обратном порядке вот это в меня сразу и не влезло. Теперь вроде осознал.

Я правильно понимаю что порядок битов на всех архитектурах одинаковый?

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> Я правильно понимаю что порядок битов на всех архитектурах одинаковый?

да. За редким исключением (настолько редким, что думать об этом на уровне обработки TCP/IP не стоит).

Slavaz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.