C++ 大端小端转换

C++ 大端小端转换,c++,endianness,C++,Endianness,我看到一个关于堆栈溢出的问题,即如何从一个端点转换到另一个端点。解决办法是这样的: template <typename T> void swap_endian(T& pX) { char& raw = reinterpret_cast<char&>(pX); std::reverse(&raw, &raw + sizeof(T)); } 模板 无效交换(T&pX) { char&raw=重新解释铸件(pX); 标

我看到一个关于堆栈溢出的问题,即如何从一个端点转换到另一个端点。解决办法是这样的:

template <typename T>
void swap_endian(T& pX)
{
    char& raw = reinterpret_cast<char&>(pX);
    std::reverse(&raw, &raw + sizeof(T));
}
模板
无效交换(T&pX)
{
char&raw=重新解释铸件(pX);
标准:反向(&raw,&raw+sizeof(T));
}

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

是的,它会,因为不需要交换位

编辑: Endianness会影响为2个字节或更多的值写入字节的顺序。小尾数表示最低有效字节排在第一位,大尾数排在第二位

如果您收到一个由小endian系统编写的大的eindian字节流,那么字节中最重要的位是什么毫无争议。如果位顺序受到影响,则无法可靠地读取彼此的字节流(即使它只是普通的8位ascii)

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


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

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

您是正确的,该函数只交换字节顺序,而不交换单个位。这通常足以用于联网。根据您的需要,您可能会发现htons()也很有用

:

大多数现代计算机处理器都同意这一点 关于“内部”个体的位序 字节(这并不总是 案例)。这意味着任何单个字节 值在几乎相同的时间内读取 任何人都可以将其发送到任何计算机。”


bigendian vs little endian与字节在较大单位内的顺序有关,如int、long等。字节内的位顺序是相同的。

为什么要交换位?:)效率极低,但通用…:-)的可能重复看起来像“Endianness”中的dup从广义上讲,该术语实际上可以表示位顺序,尽管它通常与字节相关联。