LINUX.ORG.RU

Little Endian <-> Big Endian


0

0

Есть программа, которая крутится на Intel машине, и выдает по сети данные (float) всем, кто попросит. Нужно ее перевести на Sun. Проблема в том, что те, кто просит данные, давно и надежно сидят на Intel, протокол обмена устоявшийся и менять его никто будет, поэтому преобразование данных Big Endian в Little Endian приходится крутить на Sun. Есть ли в ассемблере Sparc что-нибудь аналогичное Intel-овскому swapb?

★★

Float лучше вообще передавать в текстовом виде. А если протокол уже не переделать, то смотри в man 3 endian.

Есть ли в ассемблере Sparc что-нибудь аналогичное Intel-овскому swapb?

А зачем это делать на ассемблере? Если не нравится вызов функций (хотя подозреваю, что они должны инлайниться), то напиши всё что нужно сам, там же пару строк на C.

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

Float лучше вообще передавать в текстовом виде

...и в XML завернуть, ага:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE value>
<value type="float">0</value>
mannaz
()

всем спасибо, решил-таки остановиться на макросах

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

>Говорили же: "Используй ntohl и ntohs".

В протоколе? А если там машины разной архитектуры на разных концах? В бинарном протоколе порядок байт должен быть строго оговорён.

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

> В протоколе? А если там машины разной архитектуры на разных концах? В бинарном протоколе порядок байт должен быть строго оговорён.

Ты не поверишь, но network byte order строго оговорён, да. 8)) При передаче -- hton*, при чтении -- ntoh*

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

>Ты не поверишь, но network byte order строго оговорён

Ты не поверишь, но я же не по этому очевидному поводу пишу :)

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

...и в XML завернуть, ага:

Ага не ага, но текстовое представление чисел не имеет ограничений по точности и кроссплатформенно настолько, насколько это вообще возможно.

anonymous
()
Ответ на: комментарий от kemm

угу. только на системе с Big Endian вызов hton* - это простая заглушка, которая ничего не выполняет, поскольку "network byte order" == "big endian"

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

> В протоколе? А если там машины разной архитектуры на разных концах? В бинарном протоколе порядок байт должен быть строго оговорён.

Ну да, и бинарный протокол должен использовать именно big endian, это избавляет от переписывания кода под распространенные архитектуры. Везде спасает ntohl. Неправда?

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

:)во-первых, никому бинарный протокол без заключения суда ничего не должен, во-вторых, попробуй при помощи ntohl преобразовать простой float, в-третьих, есть еще типы long long, не говоря уже про long double. это с ходу так..

из man htonl: > On the i80x86 the host byte order is Least Significant Byte first, whereas the network byte order, as used on the Internet, is Most Significant Byte first.

ну а мы-то не на Internet пишем? :)

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

...текстовое представление чисел не имеет ограничений по точности...

Если ты считаешь это хорошим аргументом, то тогда, наверное, нужно вообще все числа, включая целые, в текстовом виде слать? А что мешает передавать числа без ограничений по точности в бинарном виде?

...кроссплатформенно настолько, насколько это вообще возможно

Т.е. зафиксировать в протоколе как минимум правила передачи строк переменной длины, кодировку и символ разделения целой и дробной части - это на порядок кроссплатформеннее чем заморочиться с банальным порядком байт?

mannaz
()
Ответ на: комментарий от KRoN73

А по какому, можно узнать? Человек говорит, что сетевой порядок байтов - однозначная спецификация. И решила бы проблему топикстартера, если б он о ней подумал заранее...

Или я чего-то не знаю про сетевой порядок байтов?

ЗЫ А вообще вот почитаешь этот тред, и начинаешь верить во всеисцеляющую силу XML

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

«протокол обмена устоявшийся и менять его никто будет»

Т.е. порядок байтов - это не сетевая практика, а всего лишь устоявшаяся практика. Было бы не влом - поменяли бы в протоколе.

Об этом и речь.

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

> ЗЫ А вообще вот почитаешь этот тред, и начинаешь верить во всеисцеляющую силу XML

Ну нельзя же быть таким впечатлительным

mannaz
()
Ответ на: комментарий от Vinill

> во-вторых, попробуй при помощи ntohl преобразовать простой float

Может конечно твоему удивлению не будет предела, но float преобразуется так же, как и long. Про long long надеюсь догадаешься сам.

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

стандарт IEEE специфицирует только раскладку по битам и байтам, но не специфицирует порядок байт. Порядок байт не обязан совпадать с порядком для целых.

dilmah ★★★★★
()

а на Sparc-ах формат хранения float такой же, как и на Intel?
просто любопытно...

xydo ★★
()

Читать стандарт на числа с плавающей точкой до просветления. Кратко: float везде одинаковый, и порядок байт то-же.

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

> Читать стандарт на числа с плавающей точкой до просветления. Кратко: float везде одинаковый, и порядок байт то-же.

укахи какой именно стандарт. "endianness of the memory representation is not part of the IEEE specification".

машинный порядок байт у флоатов может быть разный. Порядок специфицирован в RFC 1014 - XDR: External Data Representation standard.

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

>угу. только на системе с Big Endian вызов hton* - это простая заглушка

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

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