Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将无符号短字符数组转换为无符号字符数组_C++_C_Arrays_Casting - Fatal编程技术网

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);