С видом программ я пишу (работающий с необработанными данными файла), мне часто нужны функции для преобразования между и прямым порядком байтов с обратным порядком байтов. Обычно я пишу их сам (который охвачен многими другими сообщениями здесь), но я не настолько увлечен выполнением этого по ряду причин - основное, являющееся отсутствием тестирования. Я действительно не хочу тратить возрасты, тестирующие мой код в эмуляторе с обратным порядком байтов и часто просто опускать код для машин с обратным порядком байтов в целом. Я также использовал бы более быстрые функции, обеспеченные различными компиляторами, все еще сохраняя мои программы межплатформенными.
Единственными вещами, которые я могу найти, являются вызовы сокета как htons (), но они требуют различных #include файлов на каждой платформе и некоторого кода GPL как это, однако который конкретный файл, в то время как всесторонний, кажется, пропускает некоторые высокопроизводительные функции, обеспеченные некоторыми компиляторами.
Так, кто-либо знает о библиотеке (идеально просто.h файл), который хорошо тестируется и обеспечивает стандартный набор функций для контакта с порядком байтов через многие компиляторы и платформы?
За последнее десятилетие было несколько предложений по классу Boost (по крайней мере, для C ++), чтобы сделать именно это, но, к сожалению, ни одно из них так и не было реализовано.
Я не знаю лучшего обобщенного решения, чем набор функций htons ().
Проще всего не писать код, зависящий от порядка байтов. Вы никогда не должны заботиться о том, какова последовательность байтов в системе, в которой вы работаете; единственное, что должно иметь значение, - это то, какова обязательная последовательность байтов для любых внешних данных, которые вы читаете или пишете. Вам не следует спрашивать о преобразованиях между значениями с прямым порядком байтов и обратным порядком байтов, а скорее о преобразованиях от конкретного порядка байтов к порядку байтов хоста, и вы можете написать этот код, не зависящий от порядка байтов, который (почти) полностью переносим:
Например: предположим, что вы читаете 32-битное целое число с прямым порядком байтов из файлового потока:
/*
* Note that callers should check feof(fp) afterward to verify that
* there was enough data to read.
*/
uint32_t GetBE32(FILE* fp)
{
uint32_t result;
result = fgetc(fp) << 24;
result |= fgetc(fp) << 16;
result |= fgetc(fp) << 8;
result |= fgetc(fp);
return result;
}
uint32_t GetLE32(FILE* fp)
{
uint32_t result;
result = fgetc(fp);
result |= fgetc(fp) << 8;
result |= fgetc(fp) << 16;
result |= fgetc(fp) << 24;
return result;
}
(Я говорю «(почти) полностью переносимый», потому что он предполагает, что есть 8 бит на байт. Но если вы работаете в системе, где это не так, у вас, вероятно, возникнут более серьезные проблемы при работе с внешними данными.)