![]() |
|
Модераторы: powerfox, ZeeLax |
![]()
|
|
| xni |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 27.10.2006 Где: Обнинск Репутация: нет Всего: нет |
Есть некоторый файл. Я получаю его дамп таким образом -
0000000 41 54 26 54 46 4f 52 4d 00 20 03 17 44 4a 56 4d Все отображается верно. Теперь так -
0000000 54265441 4d524f46 17032000 4d564a44 Т.е. байты переставлены наоборот! Если не сложно - объясните, пожалуйста природу этого явления... Версия od 5.97 (Mandriva 2007) Просто там записано некоторое число, и что странно - считываю его так -
и получаю в вывод 54265441. Это сообщение отредактировал(а) xni - 14.1.2007, 15:13 |
||||||
|
|||||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 41 Всего: 181 |
Сие явление называется порядок байтов (endianness).
wikipedia x86 процессоры - little endian, т.е. младший байт у них в начале. Это сообщение отредактировал(а) nickless - 14.1.2007, 15:17 -------------------- ![]() 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 |
|||
|
||||
| xni |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 27.10.2006 Где: Обнинск Репутация: нет Всего: нет |
Ага. Разобрался! Спасибо, большое! Но что же тогда со считыванием? Опять-таки - число записано в файле (если по байту, правильно). Оно в программу приходит тоже в прямом порядке? А программа считает, что в обратном, и так его и оставляет. Или я ошибаюсь, поправьте пожалуйста!
Выход ли такая программа?
Или есть более красивый выход? И еще (простите меня за мою нескромную любопытность - но поиск неудовлетворил моих запросов), когда мы делаем логический сдвиг, то мы же представляем что число записано как в привычной нам системе счисления (первые байты - старшие (Most Significant Byte)), а оказывается - наоборот - в физическом представлении. Т.е. при логическом сдвиге происходит более сложная (что-то побайтное с переносом результата из соседнего байта?) Это сообщение отредактировал(а) xni - 14.1.2007, 19:06 |
|||
|
||||
| nickless |
|
||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 41 Всего: 181 |
Данные считываются из файла побайтово в том порядке, как они записаны и пишутся в память, то как процессор их потом обрабатывает - это его личное дело, т.к. данные в памяти по одному и тому же адресу можно интерпретировать по разному.
Да, порядок байт - это внутреннее представление числ в процессоре, то, как их видит программист - это абстракция, и работает она не зависимо от процессора. В частности при логическом сдвиге процессор читает из памяти число в определённом порядке, производит над ним операцию (как именно не важно - это уже дело железа) и пишет результат обратно в том же порядке. Проблемы могут возникать только при коммуникации машин с разной архитектурой, когда данные передаются не побайтово (в смысле пишем больше байта за раз) например через интернет, файлы (utf8 тоже) итд. Т. е. если писать и читать на процессорах с одинаковой архитектурой, то на это вообще не надо обращать внимание, но если ты хочесь портировать свою программу с x86 на какой-нибудь big-endian процессор, то нужно конвертировать данные в зависимости от порядка байтов или писать их в независимом формате. -------------------- ![]() 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 |
||||
|
|||||
| xni |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 27.10.2006 Где: Обнинск Репутация: нет Всего: нет |
Ясненько! Спасибо Вам большое! Вы все так четко и доступно объяснили мне!
Насколько я понял od, считывая по 4 байта, считает что там записано что-то 4-байтное и в формате, который сейчас в системе (в моем случае - little-endian), и любезно представляет, как он думает, мне все в читаемом, понятном человеку виде (более значимый байт - первый). Хотя тот компьютер, который это создавал и до этого так же сохранил. Откуда и получается такой вот "переворот". Огромное спасибо! Надо изучать ассемблер, наверное, раз начали появляться проблемы подобного характера, как Вы думаете? Это сообщение отредактировал(а) xni - 14.1.2007, 20:58 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 21 Всего: 207 |
никогда не помешает -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]()
|
| Правила форума "Linux/UNIX: Oбщие вопросы" | |
|
|
В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу). В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим. Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |