Управление порядком байтов - является там библиотекой C для этого?

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

Единственными вещами, которые я могу найти, являются вызовы сокета как htons (), но они требуют различных #include файлов на каждой платформе и некоторого кода GPL как это, однако который конкретный файл, в то время как всесторонний, кажется, пропускает некоторые высокопроизводительные функции, обеспеченные некоторыми компиляторами.

Так, кто-либо знает о библиотеке (идеально просто.h файл), который хорошо тестируется и обеспечивает стандартный набор функций для контакта с порядком байтов через многие компиляторы и платформы?

9
задан Malvineous 3 April 2010 в 10:20
поделиться

2 ответа

За последнее десятилетие было несколько предложений по классу Boost (по крайней мере, для C ++), чтобы сделать именно это, но, к сожалению, ни одно из них так и не было реализовано.

Я не знаю лучшего обобщенного решения, чем набор функций htons ().

2
ответ дан 4 December 2019 в 23:38
поделиться

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

Например: предположим, что вы читаете 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 бит на байт. Но если вы работаете в системе, где это не так, у вас, вероятно, возникнут более серьезные проблемы при работе с внешними данными.)

2
ответ дан 4 December 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: