C++ 将无符号短字符数组转换为无符号字符数组
我似乎不知道这里发生了什么事。我有以下警告图标C++ 将无符号短字符数组转换为无符号字符数组,c++,c,arrays,casting,C++,C,Arrays,Casting,我似乎不知道这里发生了什么事。我有以下警告图标 K_USHORT usaAlertIcon[16] = { 0x0000, 0x0000, 0x0180, 0x03C0, 0x03C0, 0x0660, 0x0660, 0x0E70, 0x0E70, 0x1E78, 0x3E7C, 0x3FFC, 0x7E7E, 0x7E7E, 0xFFFF, 0x0000 }; 现在,我想在我的代码中使用它,它认为数组是8位数据(无符号字符) 然而,当我这样做时,它似乎翻转了字节。它先画左半部,然后画右半部
K_USHORT usaAlertIcon[16] = { 0x0000, 0x0000, 0x0180, 0x03C0, 0x03C0, 0x0660, 0x0660, 0x0E70, 0x0E70, 0x1E78, 0x3E7C, 0x3FFC, 0x7E7E, 0x7E7E, 0xFFFF, 0x0000 };
现在,我想在我的代码中使用它,它认为数组是8位数据(无符号字符)
然而,当我这样做时,它似乎翻转了字节。它先画左半部,然后画右半部;因此,它将图像从中间切割下来,并将左边的部分替换为右边的部分
作为一个健全性检查,如果我自己显式地拆分数组
K_UCHAR ucaAlertIcon[32] = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x0E, 0x70, 0x1E, 0x78, 0x3E, 0x7C, 0x3F, 0xFC, 0x7E, 0x7E, 0x7E, 0x7E, 0xFF, 0xFF, 0x00, 0x00 };
一切正常
有人能解释一下为什么我进行类型转换时这些字节似乎在翻转吗
有人能解释一下为什么我进行类型转换时这些字节似乎在翻转吗
持久性。很明显,您使用的是一台小型endian机器,这意味着最低地址的字节是最低有效字节。您需要将unsigned short
值转换为big-endian格式,例如,htons
#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);
#包括
uint16_t htons(uint16_t hostshort);
你当然也可以自己做
array[i] = (array[i] << 8) | (array[i] >> 8);
array[i]=(array[i]>8);
你知道吗?@Joe:呸!你打败了我:)哎呀,我有一种感觉,这是永无止境的。奇怪的是,16位数组存储在内存中的方式与拆分时的8位数组不同。16位通常是endianness成为问题的第一个大小。这就是为什么UTF-16有一个……当然,在一台big-endian机器上,这个代码会完全崩溃。htons()是一个更安全的选择(尽管可能较慢)。当然,这回避了一个问题:为什么原始数据存储为16位?
#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);
array[i] = (array[i] << 8) | (array[i] >> 8);