big endian little endian转换

时间:2011-01-20 20:54:40

标签: c++ endianness

我看到有关堆栈溢出的问题如何从一个端到另一个端转换。解决方案是这样的:

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

我的问题是。这个解决方案会正确地交换位吗?它将以正确的顺序交换字节,但不会交换位。

4 个答案:

答案 0 :(得分:4)

是的,因为没有必要交换位。

修改 字节顺序对于为2个字节或更多的值写入字节的顺序有影响。小端表示最不重要的字节是第一个,大端表示相反。

如果你收到一个由小端系统写的大 - eindian字节流,那么在字节内最重要的位是没有争议的。如果位顺序受到影响,则无法可靠地读取每个其他字节流(即使它只是简单的8位ascii)。

这不能自动确定2字节或更大的值,因为文件系统(或网络层)不知道您是否一次发送一个字节数据,或者您是否正在发送(例如) 4个字节长。

如果您与另一个系统有直接的1位串行连接,则必须就传输层的小端或大端位排序达成一致。

答案 1 :(得分:2)

bigendian vs little endian关注字节如何在更大的单位内排序,例如int,long等。字节内的位排序是相同的。

答案 2 :(得分:1)

“Endianness”通常指的是字节顺序,而不是这些字节中位的顺序。在这种情况下,您不必反转这些位。

答案 3 :(得分:1)

你是对的,该函数只会交换字节顺序,而不是单个位。这通常足以进行联网。根据您的需要,您还可以找到有用的htons()family of functions

From Wikipedia

  

大多数现代计算机处理器都同意   在“内部”个人的位排序   字节(这不总是   案件)。这意味着任何单字节   价值将几乎相同   任何计算机都可以发送给它。“