Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разъясните, пожалуйста, один момент в od 
:(
    Опции темы
xni
Дата 14.1.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.10.2006
Где: Обнинск

Репутация: нет
Всего: нет



Есть некоторый файл. Я получаю его дамп таким образом - 

Код

od -t x1 file 


0000000 41 54 26 54 46 4f 52 4d 00 20 03 17 44 4a 56 4d

Все отображается верно.

Теперь так - 

Код

od -t x file


0000000 54265441 4d524f46 17032000 4d564a44

Т.е. байты переставлены наоборот! Если не сложно - объясните, пожалуйста природу этого явления...

Версия od 5.97 (Mandriva 2007)

Просто там записано некоторое число, и что странно - считываю его так - 

Код

fread(&length, sizeof(int), 1, input);
printf(" %x байтов\n",length);


и получаю в вывод 54265441. 

Это сообщение отредактировал(а) xni - 14.1.2007, 15:13
PM MAIL ICQ   Вверх
nickless
Дата 14.1.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 41
Всего: 181



Сие явление называется порядок байтов (endianness).
wikipedia
x86 процессоры - little endian, т.е. младший байт у них в начале.

Это сообщение отредактировал(а) nickless - 14.1.2007, 15:17


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
xni
Дата 14.1.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.10.2006
Где: Обнинск

Репутация: нет
Всего: нет



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

Выход ли такая программа?

Код

#include <netinet/in.h> 
...
fread(&length, sizeof(int), 1, input);
length=ntohl(length);
...


Или есть более красивый выход?

И еще (простите меня за мою нескромную любопытность - но поиск неудовлетворил моих запросов), когда мы делаем логический сдвиг, то мы же представляем что число записано как в привычной нам системе счисления (первые байты - старшие (Most Significant Byte)), а оказывается - наоборот - в физическом представлении. Т.е. при логическом сдвиге происходит более сложная (что-то побайтное с переносом результата из соседнего байта?)

Это сообщение отредактировал(а) xni - 14.1.2007, 19:06
PM MAIL ICQ   Вверх
nickless
Дата 14.1.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 41
Всего: 181



Цитата(xni @ 14.1.2007,  14:19)
Но что же тогда со считыванием? Опять-таки - число записано в файле (если по байту, правильно). Оно в программу приходит тоже в прямом порядке? А программа считает, что в обратном, и так его и оставляет.

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

Цитата(xni @ 14.1.2007,  14:19)
когда мы делаем логический сдвиг, то мы же представляем что число записано как в привычной нам системе счисления (первые байты - старшие (Most Significant Byte)), а оказывается - наоборот - в физическом представлении. Т.е. при логическом сдвиге происходит более сложная (что-то побайтное с переносом результата из соседнего байта?)

Да, порядок байт - это внутреннее представление числ в процессоре, то, как их видит программист - это абстракция, и работает она не зависимо от процессора.
В частности при логическом сдвиге процессор читает из памяти число в определённом порядке, производит над ним операцию (как именно не важно - это уже дело железа) и пишет результат обратно в том же порядке.

Проблемы могут возникать только при коммуникации машин с разной архитектурой, когда данные передаются не побайтово (в смысле пишем больше байта за раз) например через интернет, файлы (utf8 тоже) итд.
Т. е. если писать и читать на процессорах с одинаковой архитектурой, то на это вообще не надо обращать внимание, но если ты хочесь портировать свою программу с x86 на какой-нибудь big-endian процессор, то нужно конвертировать данные в зависимости от порядка байтов или писать их в независимом формате.



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
xni
Дата 14.1.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.10.2006
Где: Обнинск

Репутация: нет
Всего: нет



Ясненько! Спасибо Вам большое! Вы все так четко и доступно объяснили мне!

Насколько я понял od, считывая по 4 байта, считает что там записано что-то 4-байтное и в формате, который сейчас в системе (в моем случае - little-endian), и любезно представляет, как он думает, мне все в читаемом, понятном человеку виде (более значимый байт - первый). Хотя тот компьютер, который это создавал и до этого так же сохранил. Откуда и получается такой вот "переворот".

Огромное спасибо! Надо изучать ассемблер, наверное, раз начали появляться проблемы подобного характера, как Вы думаете?

Это сообщение отредактировал(а) xni - 14.1.2007, 20:58
PM MAIL ICQ   Вверх
MAKCim
Дата 15.1.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 21
Всего: 207



Цитата

как Вы думаете?

никогда не помешает  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Oбщие вопросы"
nickless
Imple
nerezus

В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
Например вопросы о выборе ОС для определенных задач (но если Вы просто хотите узнать "Какой дистрибутив лучше", то для этого есть Клуб юнуксоидов).
Общие вопросы по shell-программированию тоже лучше задавать здесь.


  • Вопросы мобильной разработки тут
  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.