将"unsigned char“数组转换为"unsigned short”数组的有效方法是什么?我通常使用以下代码片段来完成此操作。
#define CH_LINE_PIXELS 2291
#define SCANLINE_SIZE 57301
#define CH1_INDEX 2297
#define CH2_INDEX 4592
#define CH3_INDEX 6887
#define CH4_INDEX 9182
unsigned char* pUChar = new unsigned char[SCANLINE_SIZE];
unsigned short *pUS1, *pUS2, *pUS3, *pUS4;
pUS1 = reinterpret_cast<unsigned short *>(&pUChar[CH1_INDEX]);
pUS2 = reinterpret_cast<unsigned short *>(&pUChar[CH2_INDEX]);
pUS3 = reinterpret_cast<unsigned short *>(&pUChar[CH3_INDEX]);
pUS4 = reinterpret_cast<unsigned short *>(&pUChar[CH4_INDEX]);
unsigned short us1, us2;
for (unsigned int i = 0; i < CH_LINE_PIXELS; i++)
{
us1 = pUChar[CH1_INDEX + 2 * i];
us2 = pUChar[CH1_INDEX + 2 * x + 1];
pUS1[x] = us1 * 0x100 + us2;
us1 = pUChar[CH2_INDEX + 2 * i];
us2 = pUChar[CH2_INDEX + 2 * i + 1];
pUS2[x] = us1 * 0x100 + us2;
us1 = pUChar[CH3_INDEX + 2 * i];
us2 = pUChar[CH3_INDEX + 2 * i + 1];
pUS3[x] = us1 * 0x100 + us2;
us1 = pUChar[CH4_INDEX + 2 * i];
us2 = pUChar[CH4_INDEX + 2 * i + 1];
pUS4[x] = us1 * 0x100 + us2;
}发布于 2011-06-13 16:49:52
在字节边界上寻址short可能会(也可能不会)导致对齐问题,具体取决于平台。
另外,乘法是非常无效的,为什么不使用移位呢?(一些编译器可能会优化x * 0x100,但如果他们不这样做-当您想要的只是x << 8时,这会对性能造成巨大的影响……)
此外,如前所述,reinterpret_cast可能不会像您期望的那样工作。
我建议,因为您无论如何都要进行赋值,所以应该将值从char的数组复制到short的单独数组中。它需要一些内存,但是会为你省去很多意外的崩溃和其他的麻烦。
发布于 2011-06-13 16:50:16
嗯,首先你应该做的是:
us1 << 8 + us2,而不是乘以0x100,因为您希望将前8位移到较高位置,并且移位比乘法更快。
例如,你有us1 = aaaaaaaa (8位)和us2 = bbbbbbbb (另外8位)。将这些字符扩展为短字符只需在左侧填充8个零即可。
那么上面的公式将会给你:
00000000aaaaaaaa
<< 8
aaaaaaaa00000000
+ 00000000bbbbbbbb
aaaaaaaabbbbbbbb另一方面,你应该为你的结果分配一个新的短波数组。
https://stackoverflow.com/questions/6328191
复制相似问题