На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Что это: big-endian и little-endian ?
    Что это означает: big-endian и little-endian ?
      AndreySol
      Речь идет о порядке хранения цифр целого числа в оперативной памяти. Известны два принципиально различные подхода к решению этого вопроса.
      Человек "западного стиля" как читает числа, так и нумерует позиции цифр числа слева направо, в результате чего старшая цифра оказывается в самой первой левой (младшей) позиции. В компьютерной терминологии такого рода расположение целого числа в оперативной памяти называется "обратный порядок байтов" – по-английски –"big-endian". Этот же "человеческий" порядок принят и при передаче целых чисел в сети, и называется "сетевой порядок байтов – network byte order".
      В IBM-совместимых компьютерах и компьютерах некоторых других фирм принят как-бы "естественный" для компьютера порядок расположения байтов целого числа, при котором в младшей – левой - позиции числа располагается и младшая значащая цифра. Это – "прямой порядок байтов", или по-английски "litle-endian". В процессорах фирмы Motorolla и некоторых других принят обратный порядок следования.
      Например, число 247 в этих двух способах расположения в памяти будет выглядеть так:
      · 247 - обратный порядок байтов;
      · 742 - прямой порядок байтов.
      Поскольку на хосте может поддерживаться любой порядок следования байтов, то он называется общим термином "порядок байтов хоста – host byte order".
        Проще воспользоваться поиском в интернете набрав big-endian к примеру
        http://private.peterlink.ru/kx/_software_h...big2little.html
          Значит такого типа данных как big-endian или little-endian не существует ?
            Это не тип данных. Это порядок следования байтов в многобайтовых типах.
            little-endian - младший байт располагается в памяти по меньшему адресу.
            big-endian - старший байт располагается в памяти по меньшему адресу.
            Есть более сложные варианты расположения, но они довольно редки.
              Короче вот пример:
              В файле есть инфа и предстовляет из себя 2 байта: 0xFFC0
              Если ее прочитать не побайтово, а сразу в переменную типа unsigned short (2 байта), то получим мы не 0xFFC0 (big-endian), а 0x0CFF (little-endian), и нам будет их необходимо перевернуть, чтобы получить ожидаемое значение. Конечно можно по 1 байту читать и пользоваться сдвигом, но это неправильно.
                А есть какой способ определиться как считывать байты: как big-endian или как little-endian ?
                  AndreySol,

                  Это определяется исключительно форматом. То есть должно быть описано в доке какой именно формат используется в каждом конкретном случае.
                    AndreySol
                    Порядок хранения и передачи касается только целых чисел, и только тех, которые передаются в служебных заголовках, обрабатываемых по пути следования IP-пакетов, а так же в заголовках транспортных протоколов - те той информации, которая передается в сеть.
                    В файлах данных, передаваемых по протоколу TCP, это должно определяться, как было сказано, протоколом взаимодействия.
                      Ага, понял. Напоследок - подкиньте код преобразования big-endian <-> little-endian.
                        ExpandedWrap disabled
                          #define CHANGE_ENDIAN_16(x) ((((x)&0xff)<<8)|(((x)>>8)&0xff))
                          __inline int change_endian_16(int x) {
                             return CHANGE_ENDIAN_16(x);
                          }
                          #define CHANGE_ENDIAN_32(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff))
                          __inline long change_endian_32(long x) {
                             return CHANGE_ENDIAN_32(x);
                          }
                          ExpandedWrap disabled
                            inline short ByteReverse(short x) {
                                return (x << 8) | (x >> 8);
                            }
                             
                            inline long ByteReverse(long x) {
                                return (ByteReverse((short)x) << 16) | ByteReverse((short)(x>>16));
                            }


                          Цитата

                          А есть какой способ определиться как считывать байты: как big-endian или как little-endian ?

                          Обычно это задается в самом файле набором определенных байт. Нужно изучать документацию.
                          Сообщение отредактировано: Red Devil -
                            Спасибо за ответы и за код
                            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0296 ]   [ 15 queries used ]   [ Generated: 19.05.24, 20:36 GMT ]