我想转换存储为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个字节?或者我是否必须先将其转换为二进制文件?
答案 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);