2009-03-15 3 views
2

Как преобразовать значения big-endian и little-endian в C++? Я использую VC++ 6.0. Когда я использовал функцию _byteswap_ulong(), ей нужен файл заголовка intrin.h. Когда я включаю заголовок, он сообщает об ошибке, говорящей о несовместимом компиляторе, и о том, что intrin.h для компилятора gcc. Итак, есть ли какие-либо другие функции для преобразования между значениями big-endian и little-endian в VC++, кроме этой функции?Как преобразовать значения big-endian и little-endian в C++?

+0

Почему ошибка gcc имеет значение, если вы запрашиваете способ сделать это в VC++? В любом случае _byteswap_ulong не является стандартной функцией. – jalf

ответ

1

Docs, кажется, эти функции живут в stdlib.h.

+1

все, что начинается с подчеркивания, по определению является нестандартным. –

+1

Я не думаю, что он просил о стандартном способе, он просил дорогу в VC++, если я не ошибаюсь? –

8

В POSIX-совместимых систем, у вас есть стандартная byteswap (3) функции:

#include <arpa/inet.h> 

uint32_t htonl(uint32_t hostlong); 
uint16_t htons(uint16_t hostshort); 
uint32_t ntohl(uint32_t netlong); 
uint16_t ntohs(uint16_t netshort); 

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

GNU и BSD система также обеспечивает порядком байты (3) функцию:

#define _BSD_SOURCE 
#include <endian.h> 

uint16_t htobe16(uint16_t host_16bits); 
uint16_t htole16(uint16_t host_16bits); 
uint16_t be16toh(uint16_t big_endian_16bits); 
uint16_t le16toh(uint16_t little_endian_16bits); 

uint32_t htobe32(uint32_t host_32bits); 
uint32_t htole32(uint32_t host_32bits); 
uint32_t be32toh(uint32_t big_endian_32bits); 
uint32_t le32toh(uint32_t little_endian_32bits); 

uint64_t htobe64(uint64_t host_64bits); 
uint64_t htole64(uint64_t host_64bits); 
uint64_t be64toh(uint64_t big_endian_64bits); 
uint64_t le64toh(uint64_t little_endian_64bits); 

(на OpenBSD, количество для битовой ширины всегда в конце функции: be 64toh() против betoh64(), например)

В противном случае, большинство людей определяют свои собственные макросы или функции:.

#define bswap16(x) ((x)>>8 | ((x)&255)<<8) 
#deinfe bswap32(x) ((bswap16((x)>>16)&65535)|(bswap16((x)&65535)<<16)) 
/* etc. */ 

Вы также можете использовать сборочные встроенные функции, как с инструкцией BSWAP на x86. __builtin_bswap64 в GCC и ICC. Нечто похожее на VS с VS7.0.

+0

+1, но я не думаю, что вам нужно использовать intrinsics, потому что они используются автоматически, когда вы используете библиотечные функции. –

+0

Я не полагаюсь на это. Я понимаю, что некоторые инструментальные средства достаточно умен, чтобы сделать это, но я все еще не вижу, чтобы компилятор превратил вызов fsqrt() в эквивалент SSE с 3 инструкциями. – greyfade

+0

greyfade: Это зависит. VC++ имеет возможность использовать встроенные функции для встроенных функций. И, конечно же, вам нужно настроить таргетинг на платформу, поддерживающую SSE. Аналогичные варианты имеют GCC. Но, конечно, если вы не укажете компилятору, что SSE доступен, он не будет использоваться. – jalf

Смежные вопросы