C ++:如何交换wchar_t的字节顺序

时间:2014-10-24 20:53:42

标签: c++ unicode

我想转换存储为wchar_t*的UTF-16字符数组的字节顺序。在这种情况下假设sizeof(wchar_t) == 2

需要从BE转换为LE和LE转换为BE,因此ntoh / nton不起作用。

我已阅读How do I convert between big-endian and little-endian values in C++?,但我不确定如何将其应用于wchar_t

有没有办法交换wchar_t的2个字节?或者我是否必须先将其转换为二进制文件?

编辑:虽然我没有测试所有答案,但我相信它们都有效。也就是说,我认为Jarod42的答案更直接。

4 个答案:

答案 0 :(得分:2)

以下可能会有所帮助:

std::uint16_t swap_endian(std::uint16_t u)
{
    return (u >> 8) | ((u & 0xFF) << 8);
}

答案 1 :(得分:1)

反转任何类型的字节,无论多长时间:

template<class T> void reverse_bytes(T& x) {
    char* a = std::addressof(x);
    for(char* b = a + sizeof x - 1; a<b; ++a, --b)
        std::swap(*a, *b); 
}

答案 2 :(得分:0)

我认为这应该有效:

int main()
{
    wchar_t c = L'A';

    // char* can alias anything
    char* cptr = reinterpret_cast<char*>(&c);

    if(sizeof(wchar_t) == 2)
        std::swap(cptr[0], cptr[1]);
    else if(sizeof(wchar_t) == 4)
    {
        std::swap(cptr[0], cptr[3]);
        std::swap(cptr[1], cptr[2]);
    }
}

答案 3 :(得分:0)

  

需要从BE转换为LE和LE转换为BE,因此ntoh / nton不起作用。

我仍然建议使用ntoh / hton函数系列:
BE ==网络字节顺序
LE ==主机字节顺序

所以:
对于BE - &gt; LE使用:uint16_t ntohs(uint16_t netshort);
对于LE - &gt;使用:uint16_t htons(uint16_t hostshort);