обратное преобразование - PullRequest
0 голосов
/ 20 января 2011

Я видел вопрос о переполнении стека, как конвертировать из одного порядка в другой.И решение было таким:

template <typename T>
void swap_endian(T& pX)
{
    char& raw = reinterpret_cast<char&>(pX);
    std::reverse(&raw, &raw + sizeof(T));
}

Мой вопрос.Будет ли это решение менять местами биты правильно?Он поменяет местами байты в правильном порядке, но не поменяет местами биты.

Ответы [ 4 ]

4 голосов
/ 21 января 2011

Да, будет, потому что нет необходимости менять биты.

Редактировать: Порядковый порядок влияет на порядок, в котором байты записываются для значений 2 байтов или более,Младший порядок байтов означает, что младший байт идет первым, а старший - наоборот.

Если вы получаете поток байтов с большим эйндианом, записанный в системе с прямым порядком байтов, то нет никаких сомнений в том, что самый старший бит находится в байтах.Если порядок битов был затронут, вы не могли надежно читать потоки байтов друг друга (даже если это был просто 8-битный ASCII).

Это не может быть определено автоматически для 2-байтовых или больших значений, так как файловая система (или сетевой уровень) не знает, отправляете ли вы данные байт за раз, или если вы отправляете целые(например) длиной 4 байта.

Если у вас есть прямое 1-битное последовательное соединение с другой системой, вам придется договориться о порядке младших или больших порядковых битов на транспортном уровне.

2 голосов
/ 21 января 2011

bigendian vs little endian касается того, как байты упорядочены в пределах большей единицы, такой как int, long и т. Д. Порядок битов в байте одинаков.

1 голос
/ 21 января 2011

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

Из Википедии :

Большинство современных компьютерных процессоров согласны при заказе "внутри" персонажа байт (это было не всегда дело). Это означает, что любой однобайтовый значение будет читаться одинаково на почти любой компьютер, на который можно отправить его. "

1 голос
/ 21 января 2011

«Endianness» обычно относится к порядку байтов, а не к порядку битов в этих байтах.В этом случае вам не нужно менять биты.

...