WedX - журнал о программировании и компьютерных науках

стандартный способ определения машинного порядка байтов

Итак, я знаю, как определять порядок байтов программно.

Вопрос

Есть ли более стандартный или собственный (закрытый ящик) способ определения порядка следования байтов? предлагает ли WINAPI такое решение?

23.10.2014

  • стандартный способ - использовать ntohl() и htonl() при преобразовании данных, они знают, какой порядок байтов у машины 23.10.2014
  • Поправьте меня, если я ошибаюсь, но, насколько я знаю, все архитектуры, на которых работает Windows, в любом случае имеют обратный порядок байтов. 23.10.2014
  • @Michael: ЦП ARM могут загружаться как в режиме с прямым порядком байтов, так и в режиме с прямым порядком байтов, хотя, насколько я знаю, все системы Windows, работающие на процессорах ARM, загружаются в режиме с прямым порядком байтов. Однако я не могу утверждать, что будущие выпуски Windows будут работать на неизвестном оборудовании. Как таковой вопрос актуален. 23.10.2014

Ответы:


1

Стандартная функциональность С++ для определения порядка байтов не предусмотрена. И я, и Беман Доус работаем над тем, чтобы это исправить. Однако успех в таком начинании будет как ледниковым, так и далеко не гарантированным.

Я экспериментировал со следующим заголовком:

https://github.com/HowardHinnant/hash_append/blob/master/endian.h

который, как показано, не переносим в Windows, но, безусловно, может быть легко перенесен в Windows разработчиком std::lib. Механизм очень прост:

// endian provides answers to the following questions:
// 1.  Is this system big or little endian?
// 2.  Is the "desired endian" of some class or function the same as the
//     native endian?
enum class endian
{
    native = // unspecified,
    little = // unspecified,
    big    = // unspecified
};

Если вы работаете на машине с прямым порядком байтов, то endian::native == endian::little.

Если вы работаете на машине с обратным порядком байтов, то endian::native == endian::big.

Если вы работаете на машине со смешанным порядком следования байтов (я давно ее не видел), то endian::native имеет значение, отличное от big или little.

Этот файл:

https://github.com/HowardHinnant/hash_append/blob/master/hash_append.h

показаны некоторые примеры использования этого объекта. Например, есть что-то, называемое Hasher, которое может запросить, чтобы предоставленные ему скаляры были представлены в одной из трех форм:

  1. родной endian, что бы это ни было.
  2. большой порядок байтов.
  3. маленький порядок байтов.

И есть небольшая утилита, которая инвертирует (или нет) байты скаляра, в зависимости от пожеланий Hasher и родного endian платформы:

template <class T>
constexpr
inline
void
reverse_bytes(T& t)
{
    unsigned char* bytes = static_cast<unsigned char*>(std::memmove(std::addressof(t), std::addressof(t), sizeof(T)));
    for (unsigned i = 0; i < sizeof(T)/2; ++i)
        std::swap(bytes[i], bytes[sizeof(T)-1-i]);
}

template <class T>
constexpr
inline
void
maybe_reverse_bytes(T& t, std::true_type)
{
}

template <class T>
constexpr
inline
void
maybe_reverse_bytes(T& t, std::false_type)
{
    reverse_bytes(t);
}

template <class T, class Hasher>
constexpr
inline
void
maybe_reverse_bytes(T& t, Hasher&)
{
    maybe_reverse_bytes(t, std::integral_constant<bool,
                                           Hasher::endian == endian::native>{});
}
23.10.2014
  • Хорошо, это потрясающе. Но вопрос в том, какие инструменты предоставляет Windows API. 23.10.2014
  • У меня нет ответа на эту часть вопроса ОП. Я ответил только на ту часть его вопроса, которую мог. Я приветствую другие ответы, которые предоставляют эту дополнительную информацию. 23.10.2014
  • Раньше я удивлялся, почему компиляторам было так сложно просто предложить переносимый статический метод получения целевого порядка следования байтов. Оказывается, оборудование с динамическим порядком байтов встречается чаще, чем вы думаете, даже если динамические возможности используются редко. 24.10.2014
  • Нам нужен API, который поддерживает как статический, так и динамический порядок следования байтов. Если цель имеет статический порядок следования байтов, тогда различные вызовы подкачки должны быть статически известны и оптимизированы. Если порядок следования байтов является динамическим, то API должен скрывать проверку во время выполнения и делать все правильно с точки зрения настройки поведения функций подкачки. Может быть, это может поддерживаться функцией, которая constexpr для платформ со статическим порядком байтов и не constexpr в противном случае? 24.10.2014
  • @ bames53: я знаю, что некоторые аппаратные средства (например, ARM) можно переключать между прямым и обратным порядком байтов. Однако знаете ли вы о какой-либо платформе, для которой это верно? т.е. что-то, для чего вы можете скомпилировать программу на C++, запустить ее и изменить порядок байтов во время выполнения? Мне трудно представить, как можно построить ОС для работы в такой среде. Однако, если вы знаете об одном, то я исправляюсь. 24.10.2014
  • PPC разрешает это в соответствии с этим. Это, по-видимому, указывает на то, что ARM может иметь фиксированный порядок байтов в аппаратном обеспечении, или аппаратное обеспечение может быть настроено так, чтобы программное обеспечение могло устанавливать порядок следования байтов . 24.10.2014
  • Но можете ли вы настроить компилятор С++ 11 (или лучше) (возможно, в автономной конфигурации) на одну из этих комбинаций оборудования и ОС для создания программы на С++, которая будет использовать более одного порядка байтов во время выполнения программы? Меня не очень беспокоит теоретическая возможность в компьютерной лаборатории университета. Я обеспокоен тем, что стандарт C++ не основан на чисто теоретической платформе, которая никогда не будет реализована на практике. 24.10.2014
  • В PPC инструкция для доступа к регистру состояния машины является привилегированной, поэтому для ее установки требуется расширение ядра. Я считаю, что VirtualPC работает именно так. Конечно, я могу скомпилировать код C++, который пытается использовать MSR, но в пользовательском режиме он выдает EXC_BAD_INSTRUCTION. Может быть, я попробую написать расширение ядра и посмотрю, что произойдет... 24.10.2014
  • @bames53: Большое спасибо за внимательное изучение. 24.10.2014
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]